.Net開發筆記(十五) 基於“泵”的TCP通訊(接上篇)

周見智發表於2013-08-29

上一篇部落格中說了基於“泵”的UDP通訊,附上了一個Demo,模擬飛鴿傳書的功能,功能不太完善,主要是為了說明“泵”在程式設計中的應用。本篇文章我再附上一個關於TCP通訊的兩個Demo,也都採用了“泵”模式:

1.由於我把通訊部分的程式碼寫在了一個dll中,這個demo只是簡單的應用這個dll,主要完成傳送字串、位元組流、可序列化物件等功能,效果圖如下:

圖1 服務端

圖2 客戶端

2. 一個簡單的螢幕監控程式,主要有螢幕監控、鍵盤滑鼠監控、鍵盤滑鼠控制等功能。監控服務端可以同時監控多個客戶端,效果圖如下:

圖3 服務端監控介面

這個demo稍微複雜一點,各功能實現如下:

  • Windows Hook程式設計,主要使用了WH_MOUSE_LL和WH_KEYBOARD_LL兩種低階鉤子,所以鉤子回撥方法直接寫在了同一個程式中,沒有單獨寫在一個dll中。使用這兩種鉤子主要是監控客戶端的滑鼠和鍵盤資訊;
  • 螢幕監控直接截圖傳送到服務端,沒有使用任何演算法,效率不高但可以看,畢竟這個不是重點;
  • 由於要遠端操作滑鼠和鍵盤,客戶端使用了mouse_event 和 keybd_event兩個win32 API,模擬滑鼠個鍵盤輸入。

雙擊監控螢幕控制遠端主機螢幕。

再說一下通訊部分的原理,其實它跟UDP中的結構差不多,不同的是UDP中是一對一的,“泵”結構只有一個,借用上一篇部落格中的插圖:

圖4 泵結構

TCP中的客戶端跟上圖差不多,服務端就稍微有點不同,因為它需要接收多個客戶端的資料,因此“資料接收泵”、“資料分析泵”都有多個,每一個都跟上圖類似。

本TCP通訊庫沒有做心跳檢測處理,因此在斷網和斷電等情況下,不會激發相應事件通知你掉線。該功能需要你自己實現,比如每隔一定時間給雙方傳送一個資訊。

原始碼共有4個專案:

  • TCPCommunication:通訊庫
  • TCPCommunicationDemoServer:demo1的服務端
  • TCPCommunicationDemoClient:demo1的客戶端
  • RemoteDeskServer:demo2的服務端
  • RemoteDeskClient:demo2的客戶端

第二個Demo效能有待優化(可以將鉤子部分程式碼註釋掉,不再監控客戶主機的鍵盤滑鼠輸入)。VS2008 Win7編譯通過,原始碼下載地址:http://files.cnblogs.com/xiaozhi_5638/TCPCommunication_Source.rar

希望對各位有幫助,謝謝。

相關文章