通訊項目——仿QQ聊天程式
詳細設計說明書
一、引言
此項目為驗證Java語言Socket部分學習成果,本文檔将對此項目進行詳細說明。
二、總體設計
子產品劃分
本項目共分為伺服器端和用戶端兩大子產品。
伺服器端共有6個子產品:
等待用戶端的連接配接,一但連接配接成功則分發給線程處理;
接收用戶端傳遞來的消息;
向用戶端回複應答消息;
連接配接資料庫并進行增删改查等操作;
轉發A用戶端的消息給B用戶端;
處理用戶端下線。
用戶端共有5個子產品:
連接配接伺服器;
向伺服器發送消息;
接收伺服器的應答消息;
接收有伺服器轉發的另一用戶端消息;
斷開與伺服器的連接配接。
功能劃分
本項目所實作的功能有:
注冊,登陸,添加好友,單人聊天。
其中添加好友做了驗證處理,單人聊天支援:視窗抖動,發送表情,傳送檔案等特色功能。
技術點支援
本項目使用Java語言編寫,所涉及到的技術點有:Socket,Thread,GUI,JDBC等。
環境支援
Eclipse,MySQL
三、詳細設計
資料庫設計
資料庫共四張表格,見下圖:

由上至下分别為:組群資訊表,組群與使用者聯系表,使用者資訊表,使用者好友關聯表。
Groups表結構如下:
Groupsusers表結構如下:
Users表結構如下:
Usersfriends表結構如下:
通信協定
消息資料類型定義
類型 | 說明 |
byte | 用于表示消息類型,一個位元組的整數 |
Unsigned Integer | 網絡位元組順序 |
Octet String | 定長字元串,不足在右邊補齊二進制0 /0 |
消息類型
标志值 | 描述 | |
1 注冊請求消息 | 0x01 | 用戶端發送注冊請求資料給伺服器 |
2 注冊應答消息 | 0x02 | 伺服器傳回注冊結果 |
3 登入請求消息 | 0x03 | 用戶端發送QQ号碼和密碼的消息請求登入 |
4 登入應答消息 | 0x04 | 伺服器傳回的登入結果應答消息 |
5 線上好友清單消息 | 0x05 | 伺服器發送給登入成功用戶端的其他好友清單消息 |
6 好友上線消息 | 0x06 | 伺服器發送通知某使用者好友上線消息 |
7 好友下線消息 | 0x07 | 伺服器發送通知某使用者好友下線消息 |
8 聊天消息發送 | 0x08 | 用戶端發給伺服器或伺服器發給某用戶端的文本聊天消息 |
9 檔案傳送消息 | 0x09 | 用戶端發給伺服器,或伺服器發給某用戶端的檔案資料傳送消息 |
10 檔案傳送應答 | 0x11 | 用戶端發給伺服器,或伺服器發給某用戶端的檔案資料傳送應答消息 |
11 截圖消息發送 | 0x12 | 用戶端發給伺服器或伺服器發給某用戶端的截圖消息 |
12 視窗抖動消息 | 0x13 | 用戶端發給伺服器或伺服器發給某用戶端的視窗抖動消息 |
13 建立組群請求消息 | 0x14 | 用戶端發給伺服器的建立組群消息 |
14 建立組群請求應答 | 0x15 | 伺服器發送給用戶端的建立組群應答消息 |
15 查找線上使用者消息 | 0x16 | 用戶端發給伺服器查詢線上使用者的消息 |
16 查找線上使用者應答 | 0x17 | 伺服器應答用戶端的查找消息結果 |
17 添加好友請求 | 0x18 | 用戶端發給伺服器請求加好友消息,或伺服器發給被添加使用者的加好友的請求消息 |
18 添加好友應答 | 0x19 | 伺服器應答用戶端加好友的結果 |
19伺服器發送群組清單 | 0x21 | 登入後伺服器發送個用戶端該使用者的群組清單 |
20查找組群請求 | 0x22 | 用戶端發送給伺服器的查找組群請求 |
21查找組群應答 | 0x23 | 伺服器發送給用戶端的查找組群應答 |
22添加組群請求 | 0x24 | 用戶端發送給伺服器的添加組群請求 |
23添加組群應答 | 0x25 | 伺服器發送給用戶端的添加組群應答 |
21群聊消息發送與接收 | 0x26 | 用戶端發給伺服器或伺服器發給該群所有用戶端的文本聊天消息 |
消息整體結構規則
結構 | |
Message Head | 消息頭 所有消息公共的消息頭 |
Message Body | 消息體 各種消息的消息體不同 |
消息頭規則
字段名 | 資料類型 | 位元組數 | |
totalLen | int | 4 | 消息位元組總長 包含消息頭總長度 |
type | byte | 1 | |
dest | 消息目的地 消息發送給誰 | ||
src | 4 | 消息源 誰發送的消息 |
具體消息結構定義
1、注冊消息體結構
字段 | 長度 | ||
nikeName | 10 | 注冊使用者昵稱 | |
password | 注冊使用者密碼 | ||
注冊的時候,消息頭中的dest值為伺服器的QQ号碼 |
2、注冊應答消息體結構
state | 伺服器傳回的注冊結果應答,0為成功,消息頭中的dest值為注冊成功的QQ号碼;非0為注冊失敗。 |
3、登入請求消息體結構
pwd | 消息總長減去消息頭長度 | 登入使用者的密碼 |
4、登入應答消息體結構
0:成功 1:賬号錯誤 2:IP驗證失敗 |
5、好友清單消息體結構
listCount | 好友分組個數 | |||
ListCount | listName | 一個分組的名字 | ||
bodyCount | 本組内有多少個使用者 | |||
組内的bodyCount個好友 | bodyNum | 組内一個好友的QQ号 | ||
好友昵稱 | ||||
如果有多組,後面的結構同 listCount個分組資料部分 |
6、好友上線消息體結構
無 | 消息頭長度 | 消息頭中包含消息類型 |
7、好友下線消息體結構
8、聊天消息體結構
msgContent | 聊天的消息内容 |
9、檔案傳送消息體結構
filename | 傳送的檔案名字 | ||
fileData | 總長-消息頭長(13)-256 | 檔案内容 |
10、檔案傳送應答消息體結構
被發送檔案的用戶端傳回給伺服器或伺服器傳回給發送檔案的用戶端的檔案傳送結果應答,0為接收,前者消息頭中的dest值為伺服器QQ号碼,後者消息頭中的dest值為發送檔案的用戶端的QQ号碼;1為拒絕接收;2為發送成功;-1為發送失敗。 |
11、截圖發送消息體結構
待定 | 截屏得到的圖檔 |
12、視窗抖動發送消息體結構
13、建立組群請求消息
GroupName | String | 16 | 建立的組群名稱 |
14、建立組群請求應答
GroupID | 伺服器生成的群ID |
15、查找線上使用者消息
16、查找線上使用者應答消息體結構
userCount | 使用者數量 | |||
userCount個使用者資料 | 一個使用者的昵稱 | |||
QQNum | 一個使用者的QQ号碼 | |||
如果有userCount個使用者,後面的結構相同 |
17、添加好友請求消息體結構
要添加的好友的QQ号碼 |
18、添加好友應答消息體結構
被添加的好友的QQ号碼 | |||
被添加的好友的昵稱 |
19、伺服器發送群組清單
GroupCount | 組群數量 | |||
一個組群的名稱 | ||||
GNum | 一個組群的ID | |||
GMasterNum | 群組的ID | |||
如果有GrouopCount個組群,後面的結構相同 |
20、查找組群消息
21、查找組群應答
22、添加組群請求
GID | 要添加的群的ID |
23、添加組群應答