本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/clb929/article/details/51085983
* HP-Socket 官方網站:http://www.jessma.org
* HP-Socket 項目主頁:http://www.oschina.net/p/hp-socket
* HP-Socket 開發文檔:http://www.oschina.net/p/hp-socket/doc
* HP-Socket 源代碼下載地址:https://github.com/ldcsaa/HP-Socket
因為HP-Socket 的PACK模型自動處理了TCP協議socket通信的分包、組包、粘包、心跳等,對於一些沒有特殊要求的應用是很好的選擇,下面就說說在C#中如何使用HP-Socket 的PACK模型來做TCP通信的服務端和客戶端。
不想看大段啰嗦,只想看源代碼的,OK,練習程序源代碼下載地址:http://pan.baidu.com/s/1skCD7jv
更新記錄:
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都應該算的上國產優秀的開源項目。
---------------------
作者:clb929
來源:CSDN
原文:https://blog.csdn.net/clb929/article/details/51085983
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!