537-C#編寫的基于TCP通信的IMV3源碼
我們知道在網(wǎng)絡(luò)通信中,如果所有的通信都通過服務(wù)器轉(zhuǎn)發(fā),會增加服務(wù)器的負擔,如果實現(xiàn)了P2P,客戶端之間直接通訊,比如聊天或者傳送文件時不再通過服務(wù)器,而是客戶端之間直接通信,將會有效的減輕服務(wù)器的負擔,提高程序的效率。
本節(jié)相關(guān)的P2P,指的是通過TCP協(xié)議,在局域網(wǎng)中實現(xiàn)的P2P,廣域網(wǎng)中的P2P暫時沒有涉及。
本Demo基于來自英國的networkComms2.3.1開源通信框架
工作原理-通過服務(wù)器,在客戶端之間建立P2P通道,之后客戶端之間的通訊可以脫離服務(wù)器
流程如下:
NetworkComms通信框架的內(nèi)在通信機制,使得我們實現(xiàn)P2P通信非常的簡單。
(1):服務(wù)器開始監(jiān)聽
(2) :客戶端,開始連接服務(wù)器,然后也開始監(jiān)聽工作,其實成為一個服務(wù)器。連接的過程中,系統(tǒng)會給客戶端隨機分派一個端口,以便完成與服務(wù)器的通信。連接完成后,我們獲取到客戶端的IP和與服務(wù)器通信的端口,客戶端在此端口上展開監(jiān)聽,也就是說每個客戶端都會展開監(jiān)聽,具備作為服務(wù)器的所有特質(zhì)。
模擬代碼:
ConnectionInfo connInfo = new ConnectionInfo("服務(wù)器IP", "服務(wù)器端口");
//客戶端與服務(wù)器進行連接
Connection newTcpConnection = TCPConnection.GetConnection(connInfo);
//客戶端與服務(wù)器連接成功后,開始監(jiān)聽本地端口,客戶端也稱為可以監(jiān)聽的服務(wù)器
TCPConnection.StartListening(connInfo.LocalEndPoint);
//客戶端與服務(wù)器進行連接
Connection newTcpConnection = TCPConnection.GetConnection(connInfo);
//客戶端與服務(wù)器連接成功后,開始監(jiān)聽本地端口,客戶端也稱為可以監(jiān)聽的服務(wù)器
TCPConnection.StartListening(connInfo.LocalEndPoint);
(3):每個客戶端需要維護一個“P2P通信的連接”表
我們用一個靜態(tài)類來實現(xiàn),具體可查看Common類
//字典中存儲 用戶ID 和相應(yīng)的連接引用
//字典中存儲 用戶ID 和相應(yīng)的連接引用
public static Dictionary UserConnList = new Dictionary();
相關(guān)操作方法
(4):客戶端成功登陸后,從服務(wù)器獲取所有在線其他客戶端用戶的本地端點(IP和端口)(即在其他客戶端在步驟一中展開監(jiān)聽的端點),并進行連接
《1》客戶端甲與其他客戶端逐個進行連接,連接成功后,客戶端甲添加對方用戶ID和連接引用到本地P2P通道字典中
《2》客戶端甲發(fā)送一個消息類型為”setupP2PMessage"的消息,給對方,以便于對方添加相應(yīng)的記錄到對方的P2P字典中
《3》客戶端甲與其他用戶進行連接時,客戶端甲為“客戶端”,其他的客戶端為“服務(wù)器端”,所以在P2P通道的2端,總有一端為“客戶端”,另一端為“服務(wù)器”。
配合NetworkComms通信框架,此種概念上的區(qū)分,并不影響P2P通道的通信。
客戶端甲與其他客戶端通信時,無論是作為”客戶端“或者”服務(wù)器“均可,只要與對方存在TCP長連接即可。
《4》 這種由客戶端之間彼此通信而建成的”服務(wù)器“,具備真正服務(wù)器的所有功能,會進行相應(yīng)的”心跳檢測“與”連接“維護等。
下面的代碼:某客戶端登陸后,獲取所有已在線用戶,并與之連接,連接完成后,發(fā)送”SetupP2PMessag"類型消息給對方。通過此過程,彼此雙方的“P2P連接”都會建立完成。
上面的代碼中,我們把相關(guān)的P2P通道建立消息寫入程序文件夾下“P2PINFO.txt文件”,以便于觀察P2P消息通道的建立。和通過P2P通道發(fā)送消息
(5):通過P2P通道發(fā)送消息
客戶端發(fā)送消息時,查看是否與對方存在 P2P通道,如果存在通過P2P連接發(fā)送消息,否則通過服務(wù)器發(fā)送
舉例說明,發(fā)送聊天消息時,先查看是否有 p2p 通道
(6)P2P通道的注銷
當某個客戶端掉線后,我們要把其從其他相應(yīng)客戶端的P2P通道注銷掉。
方法:服務(wù)器通過心跳檢測,知道某連接掉線后,發(fā)送消息給其他所有客戶端。

本源碼地址:http://m.bmm520.net/vip/net/2019/0512/19165.html