(中國電信荊州分公司,湖北 荊州434020)
隨著互聯網技術和計算機技術在不斷進步,通過互聯網進行通訊交流的人越來越多,聊天通訊系統也在不斷地優化,開發設計技術也在不斷地提高。下面,筆者基于Java語言對一個小型實用即時網絡聊天通訊系統的實現展開分析和設計。
整個系統的總體實現如圖1所示。客戶成功登錄后將創建一個線程來接收服務器端的信息并進行處理,同樣,服務器端接收到一個連接后就為這個連接創建一個線程來對客戶的操作進行處理。在服務器端打開之后就創建了一個數據源,為客戶服務的線程在需要訪問數據庫的時候就從服務器端的數據源里取一個數據庫的連接來進行數據庫操作,減少了頻繁的數據庫連接和釋放的次數,提高了效率。

圖1 整個系統的總體實現
客戶端與服務器端之間的消息都是一個個實現了Message接口的對象,Message接口有一個方法getType(),該方法返回該對象的類型,在發送和接收的時候都是直接對Message類型的對象進行操作[1]。這樣的好處就是在接收發送信息時可以統一處理。Message接口的定義如下所示:

具體的消息類型都已經在PackageType里面進行定義,而具體的消息類在構造時就要為type斌一個相應的值.目前系統用到的消息類和其相應的在PackageType里定義的type值如表1所示。
具體的消息類因為要通過網絡進行發送因此必須實現Serializable接口,同時要實現Message接口。下面就聊天內容消息類對具體消息類的實現進行分析。



表1 消息包和其對應的type值
在每個具體消息類里面都有一個成員type,用來標識消息的類型,實現getType方法返回type,同時type在構造函數中進行賦值。
登錄的信息在登錄窗口進行輸入,登錄過程則調用客戶端主窗口的方法來實現,如果成功登錄登錄窗口就退出,顯示客戶端主窗口,如果登錄不成功就彈出提示框,用戶可在登錄窗口修改輸入的信息再進行登錄。登錄過程的順序為:①客戶端連接服務器端。用公鑰加密生成的密鑰,把加密的密鑰發送到服務器端;服務器端用私鑰解密接收到的密鑰,設置加密密碼;②客戶端對用戶的密碼進行加密,發送驗證信息;服務器端驗證用戶信息,返回驗證結果,如果失敗就關閉socket,結束過程;③客戶端驗證失敗就提示失敗,結束過程;驗證成功就顯示主窗口,發送自己的狀態信息;服務器端讀取客戶的狀態,發送用戶的信息;④客戶端接收自己的信息,存儲下來,服務器端發送客戶的好友列表;⑤客戶端讀取好友列表。
注冊的信息在注冊窗口輸入,注冊過程就與服務器建立一個連接,把注冊時填的信息通過Regist Message發送到服務器,服務器把注冊信息添加到數據庫,然后通過RegistResultMessage返回一個注冊到的號碼給客戶端,如果過程出現錯誤就返回的注冊到的號碼為0。客戶端收到注冊結果后把注冊到的結果顯示給用戶,或者提示注冊不成功。由于在數據庫添加記錄后要返回注冊到的號碼,所以在數據庫設計的時候hmnum沒有用到自動遞增,而是在注冊的時候先得到hmnum的最大值,然后把最大值加1作為注冊到的帳號,寫到數據庫,同時把這個號碼返回給客戶端。
聊天部分是系統的核心,涉及到嚴格的順序控制和許多的細節。首先是在客戶端的實現,在好友列表的列表項里保存了所有在系統的使用過程中要用到的信息,有好友的帳號、好友的昵稱、好友的狀態、好友的頭像、好友的頭像號和與該好友的聊天窗口。收到該好友的聊天消息時,如果與該好友的聊天窗口還沒有初始化,就新建一個與該好友的聊天窗口存儲在好友的列表里,然后把收到消息加入到聊天窗口里;如果與該好友的聊天窗口已經建立就直接把收到的消息加入到聊天窗口。如果聊天窗口還沒有打開,就把好友的頭像換成跳動的頭像來提示用戶已收到該好友的聊天信息。如果主窗口已經縮進到屏幕的上方或者最小化,則系統托盤會有消息框提示收到好友的消息。要打開與該好在的聊天窗口,只要在主窗口雙擊好友的列表項就行了。如果在好友頭像跳動即有收到好友的時候打開窗口就會顯示已收到的消息,打開聊天窗口后就可以與該好友進行聊天。
發送文件的過來要由發送端、服務器和接收端共同協作來完成,要發送的文件都通過服務器來進行中轉。文件發送的順序控制為:①發送端發送文件信息,要求發送文件(發送文件的線程啟動);服務器端向接收端發送文件信息,要求發送文件;接收端選擇接收或拒絕,發送結束。②服務器端如果選擇接收,為傳輸文件創建一個線程,創建serversocket等待發送端和接收端連接,把serversocket端口發送給接收端;接收端收到端口,連接到服務器的serversocket(接收文件的線程啟動)。③服務器端與接收端連接上,把serversocket端口發送給發送端。④發送端收到端口,連接到服務器的serversocket;服務器端與發送端連接上后,向發送端發送一個信息,表示已經可以開始發送文件的數據。⑤發送端收到信息后發送數據,開始循環發送文件數據,同時更新進度條和傳輸速度;服務器端接收發送端的數據,再發送到接收端;接收端接收文件數據,同時更新進度條和傳輸速度。⑥發送端傳輸完成,線程結束;服務器端傳輸完成,線程結束;接收端傳輸完成,線程結束。
[1]Bruce Eckel.Thinking in Java [M].Third Edition.北京:機械工業出版社,2004:315-370.