基於阻塞Socket(Indy)的遠程控制類庫-TNetCommand-01 |
|
ququd
一般會員 ![]() ![]() 發表:2 回覆:3 積分:1 註冊:2004-08-14 發送簡訊給我 |
問題的提出
遠端控制類軟體的編寫是個痛苦的過程,大概的思路是(假定,控制端為Client端,受控端為Server端): 1. Client端發出命令 2. Server端解析命令 3. Server端通過解析命令,執行相應的操作 4. Server處理完畢後返回處理結果 5. Client端接收處理結果 請注意Step 2,3中Server端的處理。如果所有這些都在Server端的一個過程中處理是非常可怕的事。你不得不需要一個大的Case語句,也許這樣龐大且不停膨脹Case語句超越你的控制能力,逼迫你用更自由一點排比句if …then…,但這一切無疑都是一個痛苦的過程。 試想增加一項功能在Server端代價: 1. 增加一個命令解析if newCommand then newFunction; 2. 新增一個newFunction; 看起來不錯,勤奮一點還算可行。但如果是團隊開發,這種開發模式似乎不太容易忍受。總不能每新加一項功能,大家都要在Server端指手劃腳。 問題的提出: 1. 如何才能避免因為功能增加,導致在Server端Case語句的膨脹? 2. 如何適應團隊的開發? 設計思路
在同一個類中實現Client端和Server端的處理。 這樣做得原因只有一個,將新增功能的處理在所屬類中完成。換句話說就是將上述Server端的代價在類中完成。-“換湯不換藥”? 用統一的形式表達Client端的請求和Server端的回應。 上述“換湯不換藥”的苦衷,在這裏希望能博得一些同情。為了解決問題1,而陷入形式主義的泥潭。好了,乾巴巴的陳述只會讓人感到沮喪,讓我們直面代碼。 TNetCommand類
源代碼
// uNetCommand 為其他相關網路操作的祖先類 {{ 作者:蛐蛐 時間:2004.5.24 } unit uNetCommand; interface uses Classes, IdTCPServer, IdTCPClient; type // TNetCommand TNetCommand = class (TObject) public CommandType: Integer;?????????? RemoteCommandTime: string; function ReadData(Client: TIdTCPClient): Boolean; virtual; abstract; function WriteData(Server: TIdTCPServerConnection): Boolean; virtual; abstract; end; const TCP_QUIT=2000; // 退出 TCP_NETIMAGE=3000;// 圖像操作 TCP_NETFILE=3001; // 檔操作 TCP_NETPROCESS=3002; // 進程操作 TCP_NETSYSTEMINFO=3003; // 系統資訊 TCP_NETEXITWINDOWS=3004; // 退出Windows TCP_NETKEYBOARD=3005; // 鍵盤操作 TCP_NETMOUSE=3006; // 滑鼠操作 implementation end. 說明
TNetCommand類只有四個成員。CommandType用於描述Client端具體請求內容,可以想到在其子類中一定有許多關於此的常量定義。ReadData 和WriteData 兩個虛函數正是我所說的“用統一的形式表達Client端的請求和Server端的回應”。 等等,uNetCommand單元中下面的一組常量是做什麼用的?先看一下他的一個子類TNetImage是怎麼工作的。 ququ 發表人 - ququd 於 2004/08/21 23:01:27
------
ququ ![]() |
ququd
一般會員 ![]() ![]() 發表:2 回覆:3 積分:1 註冊:2004-08-14 發送簡訊給我 |
因為使用Delphi時間不長,對Indy更是剛剛接觸,難免讓編寫程式前輩見笑了。本來這套類庫是為了應付畢業設計的,5月底開始寫,拼命寫了9天,草草交了答卷。可想而知,代碼混亂,有時甚至接近“暴力”,毫無技巧。本想答辯完後,重新整理一下。可惜忙於擇業(現在還是閒置在家),也就將完善她的計畫擱淺了。現在想想“藏拙不如獻醜”,乾脆發出來或許能博得一些同情,幫我重構這套類庫。
也許選擇Indy是因為覺得用它來寫網路間的對話像“唱山歌”一樣——“這邊唱來那邊合”。有時也忍不住去“偷看”Indy的源代碼,時時驚歎于他人的才華。哎,不看也罷! ququ
------
ququ |
bigdogchina
版主 ![]() ![]() ![]() ![]() ![]() 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
|
ququd
一般會員 ![]() ![]() 發表:2 回覆:3 積分:1 註冊:2004-08-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |