1. 程式人生 > >HP-Socket國產優秀socket通訊元件推薦

HP-Socket國產優秀socket通訊元件推薦

因為HP-Socket 的PACK模型自動處理了TCP協議socket通訊的分包、組包、粘包、心跳等,對於一些沒有特殊要求的應用是很好的選擇,下面就說說在C#中如何使用HP-Socket 的PACK模型來做TCP通訊的服務端和客戶端。

更新記錄:

2017-02-20

HP-Socket 庫檔案更新至4.1,根據新庫檔案,略微修改了原始碼,主要是事件處理函式的引數變了

2017-02-21

簡化非UI執行緒訪問UI執行緒的方法

一、下載HP-Socket 

推薦去github下載,包含了C++原始碼和其他語言可用的DLL,下載並解壓後,在 HP-Socket-master\HP-Socket\Bin\HPSocket4CS 目錄下可以看到32位和64位2個版本的C#可用的DLL。

二、建立解決方案

建立一個名為“HP_Socket_Practice”的解決方案(windows應用程式),在該解決方案下新建2個專案“TCP_Pack_Client”和“TCP_Pack_Server”

在解決方案資料夾下新建一個名為“DLL”的資料夾,拷貝 HP-Socket-master\HP-Socket\Bin\HPSocket4CS\x86 目錄下的“HPSocket4C_U.dll”和“HPSocketCS.dll”到剛才建立的“DLL”資料夾。

在“TCP_Pack_Client”和“TCP_Pack_Server”這2個專案中都新增引用“DLL”資料夾內的“HPSocketCS.dll”,並新增 using HPSocketCS; 語句

這樣還沒完成,因為只有“HPSocketCS.dll”還不能使用HP-Socket,還必須將“HPSocket4C_U.dll”分別拷貝到“TCP_Pack_Client”和“TCP_Pack_Server”這2個專案的目標資料夾,也就是與EXE程式放到一起,在debug模式下是 \bin\debug 目錄,如果我們改變了EXE檔案的生成位置,又要手動拷貝一次。

這裡有2個概念要分清楚,“HPSocketCS.dll”(C#引入HP-Socket的P/Invoke類)這個檔案是我們在專案裡引用了,所以每次生成EXE檔案都會自動拷貝到生成目錄,“HPSocket4C_U.dll”(HP-Socket庫,C++編寫的)這個檔案我們無法直接引用,所以要手動將“HPSocket4C_U.dll”拷貝到生成目錄。

有沒有辦法讓VS每次生成EXE的時候自動將相關的檔案拷貝過來呢?答案是肯定的。

分別右鍵點選“TCP_Pack_Client”和“TCP_Pack_Server”這2個專案,選擇屬性--生成事件--後期生成事件命令列,輸入 copy "$(SolutionDir)DLL\HPSocket4C_U.dll" "$(TargetDir)" ,這樣這2個專案每次生成的時候都會到“DLL”資料夾下拷貝“HPSocket4C_U.dll"檔案到生成目錄。點選”編輯後期生成事件“--”巨集“可以看到$(SolutionDir)和$(TargetDir)的意思。

三、建立介面

分別為“TCP_Pack_Client”和“TCP_Pack_Server”這2個專案建立如下介面



四、編寫程式碼

這裡只講下大概思路

客戶端

1、建立 TcpPackClient 物件

2、繫結事件,TcpPackClient  共有5個事件要處理,OnPrepareConnect(開始連線前觸發),OnConnect(連線成功後觸發),OnSend(傳送訊息後觸發),OnReceive(收到訊息後觸發),OnClose(連線關閉後觸發)

3、設定包頭標識和包體長度,需要注意的是,客戶端和服務端的包頭標識要相同才能通訊

4、完成相關事件的事件處理方法,需要注意的是,所有的事件處理方法都是在非UI執行緒呼叫,所以不能在事件處理方法中直接更新UI,需要用到委託,還有就是不能在事件處理方法中呼叫Start()和Stop()方法

5、呼叫 client.Conncet(ip, port, checkBoxAsyncConn.Checked) 方法連線伺服器(需要服務端先開啟)

6、呼叫 client.Send(sendBytes, sendBytes.Length) 方法傳送資料

7、呼叫 client.Stop() 方法斷開連線

服務端

1、建立 TcpPackServer 物件

2、繫結事件,TcpPackServer 共有6個事件要處理,OnPrepareListen(繫結監聽地址前觸發),OnAccept(客戶端連線請求被接受後觸發),OnSend(傳送訊息後觸發),OnReceive(收到訊息後觸發),OnClose(某個客戶端連線關閉後觸發),OnShutdown(服務端元件停止後觸發)

3、設定包頭標識和包體長度,需要注意的是,客戶端和服務端的包頭標識要相同才能通訊

4、完成相關事件的事件處理方法,需要注意的是,所有的事件處理方法都是在非UI執行緒呼叫,所以不能在事件處理方法中直接更新UI,需要用到委託,還有就是不能在事件處理方法中呼叫Start()和Stop()方法

5、呼叫 server.Start() 方法啟動服務端

6、呼叫 server.Send(connId, sendBytes, sendBytes.Length) 方法傳送資料

7、呼叫 server.Stop() 方法停止服務端

五、執行效果


總結:.NET框架雖然提供了socket通訊的類庫,但是還有很多事情要自己處理,比如TCP協議需要處理分包、組包、粘包、維護連線列表等,UDP協議需要處理丟包、亂序,而且對於多連線併發,還要自己處理多執行緒。

HP-Socket的PACK模型基於TCP協議,自動處理分包、組包、粘包,使得應用程式只需要專注於業務邏輯處理,非常的實用,而且HP-Socket專案經過幾年的沉澱,還是被證明非常的穩定,免費、開源、穩定、高效、詳細的文件,無論從哪方面看,HP-Socket都應該算的上國產優秀的開源專案。