因為hp-socket 的pack模型自動處理了tcp協議socket通訊的分包、組包、粘包、心跳等,對於一些沒有特殊要求的應用是很好的選擇,下面就說說在c#中如何使用hp-socket 的pack模型來做tcp通訊的服務端和客戶端。
更新記錄:
2017-02-20
hp-socket 庫檔案更新至4.1,根據新庫檔案,略微修改了源**,主要是事件處理函式的引數變了
2017-02-21
簡化非ui執行緒訪問ui執行緒的方法
二、建立解決方案
建立乙個名為「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協議需要處理丟包、亂序,而且對於多連線併發,還要自己處理多執行緒。
Color Cube 國產的優秀配色取色工具
相比於普通的取色配色工具,color cube特別之處在於 色彩分析 將任意影象檔案拖入軟體介面並點按 分析 按鈕即可按照蜂巢圖 色板 色彩索引三種樣式向使用者展示影象中的主要配色 色板匯出 直接將分析統計結果匯出至 ps 色板或影象檔案,也可調節精度獲得最佳分析 螢幕取色 方式很特別。開啟螢幕取色...
Silverlight下的Socket通訊
在silverlight中進行通訊,只能使用4502 4534之間的埠進行資料傳輸,另外silverlight客戶端會自動向943埠的伺服器端傳送乙個 的語句請求,然後伺服器端943埠回發以下檔案以許可socket通訊。1.0 encoding utf 8 from from 4502 4534 p...
推薦乙個優秀的國產原始碼託管服務
不知道這裡有人寫過沒有,我就抄著無知者無罪的想法和大家分享一下吧。因為github在國內不穩定,前幾天開始尋找其它 託管服務,有幸發現了乙個由國人開發的產品coding.net 一進去就被酷炫的設計吸引了,抱著嘗試的態度立即申請了賬號。這個站點似乎剛上線不久,還處於測試階段,因此全部服務和功能都是免...