上一篇博客中說了基於“泵”的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
希望對各位有幫助,謝謝。