1. 程式人生 > >Socket實現仿QQ聊天(可部署於廣域網)附原始碼(2)-伺服器搭建

Socket實現仿QQ聊天(可部署於廣域網)附原始碼(2)-伺服器搭建

1.前言

     這是本系列的第二篇文章,第一篇文章得到了很多朋友們的支援,在這裡表示非常的感謝。對於這一系列文章需要補充的是這只是一篇入門級別的Socket通訊文章,對於專業人員來說完全可以跳過。本文只介紹一些基本TCP通訊技術並使用該技術實現聊天功能。本篇文章實現聊天伺服器搭建,我會把聊天伺服器部署到廣域網伺服器上,到時候大家就可以可以在原始碼裡面開啟客戶端與我聊天啦!(這只是一個初級版功能簡單不支援離線訊息,所以聊天的前提是我線上(使用者名稱為張三的就是我,Q我吧)……),也可以自己開啟兩個客戶端測試一下(除張三以外賬戶)。

2.本篇實現功能

1. 聊天室伺服器端的建立。

2. 聊天室客戶端的建立。

3. 實現客戶與伺服器的連線通訊。

4. 實現客戶之間的私聊。

3.具體實現

(1)客戶端搭建

1)執行過程 與服務端建立連線—>首次連線向伺服器傳送登入使用者資訊(格式例如 張三| )—>聊天:先將聊天訊息傳送到伺服器,然後由伺服器解析發給好友(發往伺服器的訊息如下 張三|李四|你好呀李四?),如圖

QQ截圖20160422200750

客戶端程式碼實現:

View Code

(2)伺服器端搭建

     我們上篇講到聊天伺服器與單個客戶端實現通訊,伺服器通訊的socket搭建後,開啟新的執行緒來監聽是否有客戶端連入,為了實現後期的客戶端對客戶端的通訊我們首先要儲存客戶端的socket的IP與埠號,以及使用者名稱資訊,伺服器接收到訊息後將訊息解析轉發。我實現的思路如下:

(0)伺服器頁面搭建,如下圖

圖片1

伺服器程式碼:

View Code

(1)當兩個不同客戶端的連入,生成兩個通訊套接字1,2。這時為了與客戶端實現通訊我們有必要建立一個客戶端管理類,來儲存客戶端的資訊。

(2)使用者名稱與客戶端通訊的socket的IP與埠號對應,以Dictionary字典形式存入鍵:IP與埠號 ,值:使用者名稱(這裡為演示原理所以沒加入資料庫,只是模擬,下一章再加入資料庫);當用戶第一次連入,我們必須記錄他的IP並與使用者對應起來,如果區域網聊天IP在同一網段兩個客戶端還可以互相找到, 如果廣域網下兩個客戶端只有通過伺服器轉接才能找到。

(3)宣告一個全域性訊息委託 public delegate void DGSendMsg(string strMsg);

我的思路如下圖:

QQ截圖20160422200842

下面是我寫的客戶端管理類:

image

View Code

效果:聊天
1234

(4)總結

          本次實現了客戶端對客戶端的一對一聊天(本篇不涉及資料庫),實現思路大體為:客戶端1將訊息發給伺服器,伺服器解析訊息把訊息發給客戶端2。下一篇我們講自定義協議傳送檔案,視窗抖動,以及各種檔案格式的接收的解決思路。最後你可以開啟原始碼的客戶端,登入張三以外的客戶端給我發訊息,我這邊登入的是張三的賬戶,或者開啟兩個客戶端自己聊天(不需要執行服務端,預設是我的伺服器IP,理論上有網就可以聊天),趕快試一下吧!!!

這個系列未完,待續。。。。。。。。。。。。。。。。。。。。。,期待您的關注

複製程式碼