上一篇部落格中說了基於“泵”的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編譯透過,原始碼下載地址:https://files.cnblogs.com/xiaozhi_5638/TCPCommunication_Source.rar
希望對各位有幫助,謝謝。