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

本文爲博主原創文章,未經博主容許不得轉載。 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/docgit

* HP-Socket 源代碼下載地址:https://github.com/ldcsaa/HP-Socketgithub

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

 

不想看大段囉嗦,只想看源代碼的,OK,練習程序源代碼下載地址:http://pan.baidu.com/s/1skCD7jv服務器

 

更新記錄:多線程

2017-02-20併發

HP-Socket 庫文件更新至4.1,根據新庫文件,略微修改了源代碼,主要是事件處理函數的參數變了框架

 

2017-02-21socket

簡化非UI線程訪問UI線程的方法函數

 

1、下載HP-Socket 網站

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

2、建立解決方案

建立一個名爲「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)的意思。

3、建立界面

分別爲「TCP_Pack_Client」和「TCP_Pack_Server」這2個項目建立以下界面

 

 

 

4、編寫代碼

這裏只講下大概思路

客戶端

一、建立 TcpPackClient 對象

二、綁定事件,TcpPackClient  共有5個事件要處理,OnPrepareConnect(開始鏈接前觸發),OnConnect(鏈接成功後觸發),OnSend(發送消息後觸發),OnReceive(收到消息後觸發),OnClose(鏈接關閉後觸發)

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

四、完成相關事件的事件處理方法,須要注意的是,全部的事件處理方法都是在非UI線程調用,因此不能在事件處理方法中直接更新UI,須要用到委託,還有就是不能在事件處理方法中調用Start()和Stop()方法

五、調用 client.Conncet(ip, port, checkBoxAsyncConn.Checked) 方法鏈接服務器(須要服務端先開啓)

六、調用 client.Send(sendBytes, sendBytes.Length) 方法發送數據

七、調用 client.Stop() 方法斷開鏈接

服務端

一、建立 TcpPackServer 對象

二、綁定事件,TcpPackServer 共有6個事件要處理,OnPrepareListen(綁定監聽地址前觸發),OnAccept(客戶端鏈接請求被接受後觸發),OnSend(發送消息後觸發),OnReceive(收到消息後觸發),OnClose(某個客戶端鏈接關閉後觸發),OnShutdown(服務端組件中止後觸發)

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

四、完成相關事件的事件處理方法,須要注意的是,全部的事件處理方法都是在非UI線程調用,因此不能在事件處理方法中直接更新UI,須要用到委託,還有就是不能在事件處理方法中調用Start()和Stop()方法

五、調用 server.Start() 方法啓動服務端

六、調用 server.Send(connId, sendBytes, sendBytes.Length) 方法發送數據

七、調用 server.Stop() 方法中止服務端

 

5、運行效果

 

 

總結:.NET框架雖然提供了socket通訊的類庫,可是還有不少事情要本身處理,好比TCP協議須要處理分包、組包、粘包、維護鏈接列表等,UDP協議須要處理丟包、亂序,並且對於多鏈接併發,還要本身處理多線程。

HP-Socket的PACK模型基於TCP協議,自動處理分包、組包、粘包,使得應用程序只須要專一於業務邏輯處理,很是的實用,並且HP-Socket項目通過幾年的沉澱,仍是被證實很是的穩定,免費、開源、穩定、高效、詳細的文檔,不管從哪方面看,HP-Socket都應該算的上國產優秀的開源項目。--------------------- 做者:clb929 來源:CSDN 原文:https://blog.csdn.net/clb929/article/details/51085983 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索