線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1024
推到 Plurk!
推到 Facebook!

基於阻塞Socket(Indy)的遠程控制類庫-TNetCommand-01

 
ququd
一般會員


發表:2
回覆:3
積分:1
註冊:2004-08-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-21 22:53:55 IP:202.99.xxx.xxx 未訂閱
問題的提出 遠端控制類軟體的編寫是個痛苦的過程,大概的思路是(假定,控制端為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
附加檔案:55183_NetCommand.rar
ququd
一般會員


發表:2
回覆:3
積分:1
註冊:2004-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-21 23:31:48 IP:202.99.xxx.xxx 未訂閱
因為使用Delphi時間不長,對Indy更是剛剛接觸,難免讓編寫程式前輩見笑了。本來這套類庫是為了應付畢業設計的,5月底開始寫,拼命寫了9天,草草交了答卷。可想而知,代碼混亂,有時甚至接近“暴力”,毫無技巧。本想答辯完後,重新整理一下。可惜忙於擇業(現在還是閒置在家),也就將完善她的計畫擱淺了。現在想想“藏拙不如獻醜”,乾脆發出來或許能博得一些同情,幫我重構這套類庫。 也許選擇Indy是因為覺得用它來寫網路間的對話像“唱山歌”一樣——“這邊唱來那邊合”。有時也忍不住去“偷看”Indy的源代碼,時時驚歎于他人的才華。哎,不看也罷! ququ
------
ququ
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-22 21:59:03 IP:211.162.xxx.xxx 未訂閱
Your program and design is really surprising!!! 少年才俊,青春者,人生之王也,前途不可限量 ================================= <>人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網
------
人生在勤,不索何获?
ququd
一般會員


發表:2
回覆:3
積分:1
註冊:2004-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-23 00:41:29 IP:202.99.xxx.xxx 未訂閱
重新上傳TNetcommand and TestAPP包含測試程式 NetServer文件夾下pgTestNetCommand為Project Group文件 NetServer文件夾下pTestServer為Server端Project文件 NetClient文件夾下pTestClient為Client端Project文件 NetCommand文件夾下為TNetCommand類庫 ququ
------
ququ
系統時間:2024-07-04 1:46:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!