一、即時通訊聊天的實現
實現聊天功能的基本思想是客戶端將一組資訊(包括指令型別、訊息內容等)傳送給伺服器,伺服器通過非同步的方式根據命令型別處理不同請求,最終**給客戶端。
在實現過程中,有以下幾點比較好玩或值得思考:
1.在其他執行緒中更新主線程中控制項的內容
這個問題有很多解決方法。我處理的方式是通過委託來實現內容的顯示,這樣就很好地解決了在其他執行緒中對主線程中控制項的呼叫。具體的**為:
delegate void delegatemessage(string message);
private void showmsg(string message)
else);}
}
2.非同步的訊息傳送和接受
在這裡確實孤陋寡聞了,以前的處理方式是一旦接受新的請求就開闢新的執行緒,最終考慮多使用者,多聊天的情況成功的把我搞懵了。。~~
於是,通過老師和網的幫助,採取了這種非同步的方式(這種方式太常用了,原諒我之前的無知吧。。。)
具體的函式為socket.beginreceive(),這個函式的含義就是非同步的從連線的socket獲取資料。它共包括4個過載方法。具體可檢視這裡。
我用的是
public iasyncresult beginreceive (
byte buffer,
int offset,
int size,
socketflags socketflags,
out socketerror errorcode,
asynccallback callback,
object state
)
在引數中,callback是指非同步執行的函式名,在函式中,首先執行endreceive結束掛起的一步讀取,待操作結束後在執行beginreceive方法。state是狀態,該引數是包含非同步函式接受操作的相關資訊,它是乙個使用者自定義型別的引數。函式結束後state被傳遞給endreceive委託。
通過這個方法,伺服器和客戶端就可以非同步的接受多個請求。
這個問題當時困擾了我乙個上午的時間,原因就是對非同步函式的一知半解。在更新使用者人數中,一定不要在非同步函式中執行!
本來還想實現檔案共享、多視窗,可惜時間不夠,只好讓它是個半成品了。有幾個問題值得思考:
(1)多客戶與伺服器全部都是占用乙個埠實現的,為什麼沒有產生衝突?
(2)根據訊息顯示在不同使用者視窗上如何實現?
目前這個系統還未完成,但是比較有意思的一部分已經搞定,也就是會議查詢和預約時的時間衝突檢測。
為此,我實現了兩個功能,一是乙個時間段內會議的精確查詢,二是乙個時間段內空閒時間的模糊查詢。在過濾條件上還是小有區別。
我的設計思路是在儲存過程中使用臨時表,因為以前有寫教務管理中排課的經驗,所以還算有比較清晰的思路,首先填充臨時表資料,之後遍歷存在的會議並將這些時段踢出臨時表,然後就ok了。(腫麼說起來這麼簡單。。。)這僅僅是查詢,這兩天預約還要在完成一下。**先不貼了。
三周過的也挺快的,明天又要返回昌平繼續,接下來是集體專案和畢業設計,希望還能保持現在的衝勁吧。
實訓小結(4)
今天已經實訓結束了,得個空閒的時候將之前沒上傳的筆記上傳 隨機數隨機數其實是偽隨機數,這些數其實是有規律的 seed 種子 初始值 隨機數生成器 演算法 返回兩樣東西 隨機數,生成下乙個隨機數的種子 這個種子用來再繼續生成新的隨機數 while num 5 np.random.seed 1 prin...
小學期實訓小結
持續兩周的小學期走到了盡頭,在這很短暫的時間裡我覺得自己學到了很多,收穫了很多。不同於平時上課的單調枯燥理論性強,小學期的內容則充斥著大量的實踐,這讓我覺得眼前開啟了一扇新的大門,收穫頗豐。說實話,在小學期剛開始的幾天裡,我對於這樣的學習方法十分不適應,不講原理基礎,直接開始操作實踐,在實踐的過程中...
工程實訓小結(7)
專案名稱 嵌入式工程實訓 本人進度計畫以及任務 linux系統的執行緒間通訊簡單化應用 本日任務完成情況 設計乙個類似微型版qq的登入和註冊功能。在登入成功後有私聊和退出功能。本日開發中出現的問題彙總 註冊 登入後程式無法再執行下去 本日開發收穫 注意傳送和接收同時寫時,中間清空結構體,確保將資訊傳...