1. 程式人生 > >TCP/IP簡易聊天軟體C++實現

TCP/IP簡易聊天軟體C++實現

第一步:需求

軟體需要實現的功能:

0.登入  1.私聊   2.群聊  3.檔案傳輸

第二步:考慮使用的網路通訊協議。

鑑於ICQ使用的TCP協議,採用TCP實現聊天和檔案傳輸。因為伺服器端對於使用者傳送過來的資料要進行區分是什麼型別的資料,比如聊天、檔案等等,所以設計成在應用層實現自己的協議,所謂協議,說白了就是一種約定或稱為規則,而這種約定比較多的呈現方式就是格式。

自定義協議的核心有兩個:
1. 控制碼
2. 流程控制

用Socket進行通訊,傳送的資料包一定是有結構的,類似於:資料頭+資料長度+資料內容+校驗碼+資料尾。
這個你定義一個Struct包裝起來即可。

控制碼是協議的基礎資訊,主要用來解釋資料包的基本資訊,通訊觸發的動作等,以便告知收到資料包之後應該如何處理資料包。
例如,你傳輸檔案的時候,一般會經過“傳輸開始 - 傳輸中 - 傳輸結束”三個階段,那麼Sender針對不同的階段就要定義不同的命令控制碼,以便讓Receiver知道傳輸處於什麼過程,這樣Receiver收到資料包之後便可以知道下一步該做什麼。
具體實現上類似於:
switch(iCmdType)
{
case CMD_BEGIN_TRANSFER:
    Begin();
    break;
case CMD_TRANSFERRING:
    Transfer();
    break;
case CMD_FINISH_TRANSFER:
    Finish();
    break;
......
}

而流程控制是協議的核心所在。以TCP/IP為例,Client和Server如何知道雙方已經正確建立了連線?答案就是“三次握手”。三次握手就是流程控制。這個就需要對應用程式的通訊流程把握的非常熟悉。

“把資料從Client 傳送到伺服器中Server”,Server如何判斷已經完整而且無誤地收到了一個來自於Client 的資料包?答案就是靠自定義的協議控制碼(資料長度)。收到的資料如果是正確的,迴應什麼給Client ?是錯誤的,又該回什麼給Client ?這就要靠協議所定義的流程控制。

以上是從網上找的,而我們的協議做得比較簡單,因為我們的需求很簡單。下面就給出應用層協議的格式,暫且讓我稱之為ZChat協議。

協議版本	控制欄位	源使用者id	       目的使用者id
8bit           8bit       32bit         32bit
其中控制欄位包括:
</pre></p><pre name="code" class="plain">私聊       0x01,
群聊       0x02,
檔案       0x03,
登入       0x06,
成功       0x07,
失敗       0x08,
使用者id請求 0x0C,
群組id請求 0x0D,
加入私聊   0x0E,
加入群聊   0x0F,
退出私聊   0x10,
退出群聊   0x11
好友列表   0x12
群組列表   0x13
個人註冊   0x14

第三步:考慮流程控制
1.登陸/註冊
(1)客戶端傳送登陸/註冊請求,傳送使用者名稱和密碼
(2)伺服器返回使用者id以及登陸成功/失敗資訊
2.下載好友/群組列表
(1)客戶端傳送下載好友/群組列表請求
(2)伺服器端多次(每次傳送一個)傳送好友/群組名給客戶端
(3)伺服器傳送成功/失敗資訊
3.私聊/群聊
(1)客戶端傳送請求加入私聊/群聊