用戶端的需求在前面已經分析了。這裡是用戶端的商務邏輯:
1.初始化: 初始化使用者介面(主要是清單控制項) 建立並開啟監聽通訊端 2.使用者登入: 彈出登入對話方塊 讓使用者輸入使用者名稱密碼以及伺服器資訊 根據使用者輸入的伺服器資訊建立一個新的通訊端串連伺服器 並且請求使用者鏈表 等待該通訊端可讀資料 如果是伺服器發送的錯誤訊息 則彈出訊息框並退出 登入失敗 如果是伺服器發送的使用者鏈表 則重新整理介面 登入成功 3.收到離線訊息: 在登入成功後,伺服器會檢查有無該使用者的離線訊息,用戶端在收到該離線訊息後,顯示該訊息,如果使用者點擊回複,則建立一個新的聊天對話方塊。 4.使用者聊天: 使用者聊天主要是在聊天對話方塊中完成的,由於其不經由伺服器轉寄,因此每個聊天對話方塊需要維護必要的資料用於使用者聊天。主要有:通訊雙方的使用者資訊和通訊通訊端以及使用者支援序列化的一些列對象(CSocketFile CArchive) 主動聊天:雙擊用於列表上某個使用者即可開始聊天 如果目標使用者線上 建立一個聊天對話方塊,並且串連到目標使用者(串連的通訊端由聊天對話方塊維護),顯示聊天對話方塊。之後即在該對話方塊內完成與對方的聊天 如果目標使用者離線 建立並顯示聊天對話方塊,當對話方塊被關閉後,由用戶端主視窗擷取聊天對話方塊中的使用者輸入,並將離線訊息發送到伺服器(這樣避免只為發一條離線訊息而串連伺服器) 被動聊天:當使用者的監聽通訊端收到新的串連請求,此時即為有其他使用者請求聊天 從使用者列表中找到請求聊天的使用者資訊(根據使用者請求的IP地址),然後根據這些資訊建立聊天對話方塊。需要注意的地方: 用戶端登入在向伺服器發送請求使用者鏈表時,自身資訊的IP通過聊天通訊端得到 而連接埠則擷取的是監聽通訊端的連接埠(這樣其他使用者才能夠通過使用者資訊中的連接埠向你發送聊天請求)。 由於聊天通訊端由聊天對話方塊管理,因此當聊天對話方塊被使用者A關閉時,也將銷毀聊天通訊端,這個時候如果與之聊天的使用者B繼續發送訊息將遇到錯誤。因此這裡簡便處理為一方關閉對話方塊後,另一方也隨之關閉。針對與本程式的通訊機制,解決這個問題大概有以下思路:如果要在一使用者A關閉對話方塊後就銷毀通訊端,那麼就需要在使用者B再次發送資料時,重新串連A。這需要B設立一個變數bPeerWindowClose來標識A是否關閉了串連(該變數在通訊通訊端OnClose處為True,在Accept或Connect成功後設為False),B每次在發送資料時,檢測該變數,用以判斷是否需要先重新請求串連(串連後需要更新串連通訊端)。另一種方案是A關閉對話方塊後不銷毀通訊端,這樣就要將聊天通訊端的管理權交由主視窗,通訊端本身有可讀資料時,先由主視窗判斷對應視窗是否開啟,未開啟則先開啟視窗顯示訊息,否則直接傳入顯示訊息到聊天對話方塊。當A
B都關閉了對話方塊時,主視窗才釋放聊天通訊端。 完整原始碼點擊這裡:http://download.csdn.net/detail/wudaijun/4911762