對網路編程做的比較少,用 indy 簡單的寫了一個應付程式更新的服務器,對 indy 的作業原理還是有些疑惑
1. indy 的 server 和 client 的讀寫必須一對一么?
比如說,客戶端發送一個命令給服務器,服務器可能多次呼叫 write 發送內容,客戶端必須依次進行接收,且清楚知道服務器傳遞過來的是什么東西,否則,客戶端假死或者下次 read 讀取到錯誤的內容。
這個發送什么內容,以及如何接收,是不是就是所謂的“溝通協議”的概念?
2. 因為 indy 是阻塞式的,是不是意味著客戶端如果要有好的客戶體驗,一般都是要做成多執行緒的?
uj5u.com熱心網友回復:
如果是用TCPServer,可以把發送和接收理解為寫流和讀流,如果錯亂一個位元組就沒法恢復了。INDY客戶端一般都用多執行緒。
uj5u.com熱心網友回復:
1.indy有很多東西,并不是必須server 和 client成對使用。象ftp或http之類的,就可以只用client。如TIdHTTP訪問一個網站。即使是tcp協議的,也可以不成對使用。如你已經有一個VC寫的tcp協議的服務端程式,那么你可以只用tcpclient來寫一個客戶端。2.比較簡單的的還是可以不多執行緒的,如你隔幾分鐘才接收幾十個位元組,完全沒必要搞多執行緒,客戶感覺不到的。
你的意思好象是要寫一個程式自動更新的東西。一般可以寫一個網頁放在服務器上,然后用TIdHTTP訪問這個網頁,分析內容得到需不需要更新,再下載需要更新的檔案。
uj5u.com熱心網友回復:
1.不一定是1對1,比如smtp,可以直接用它連接163,qq等若自己寫服務囂與客戶端,先定義好有那些命令與所代表的功能,然后根據接收到的命令做出不同的動作,
通信基本要做成應答模式, 即有請求就有回應
2.那要看是做什么功能了,像IdTCPClient就是要用執行緒讀取的
uj5u.com熱心網友回復:
我是想寫一個服務端出來,檔案更新服務只是服務器的一個服務而已,其他的服務還可能包括:圖片傳送服務、訊息服務、資料庫服務等...比如:
檔案服務的命令格式:fup://Check?FileName=a.exe&UserName=sea
圖片服務的命令格式:pic://GetPic?PicName=ABC001
訊息服務的命令格式:msg://Chat?....
資料庫服務:dbs://dbname=db1?Query....
類似這樣子的想法,然后這個服務在服務器上進行注冊,idTcpServer 根據客戶端的請求命令,分配任務給相應的服務進行回應
uj5u.com熱心網友回復:
呵呵!RemObject吧!uj5u.com熱心網友回復:
INDY的服務器端的EXEUTE方法本身就是寫在了執行緒里,客戶端最好有一個監聽執行緒,這個客戶端就不會阻塞,因為你的主執行緒還有很多其他的事情要做,而且客戶端也不是一直有資料可以讀取
關于協議你就看你自己定義了,不過像你在上面定義的那些協議肯定是不行的,有些像自定義協議的樣子,不過那不是用于網路傳輸的,更像是本地呼叫的,不知道你能否明白
uj5u.com熱心網友回復:
1. 對,需要“溝通協議”。2. 客戶端防止界面阻塞,可以使用TIdAntiFreeze控制元件來解決。
uj5u.com熱心網友回復:
看樓主的需求,我覺得你用http更合適,你可以看看TIdHttpserver和TIdHttp.因為用http很簡單,你不用考濾很多東西uj5u.com熱心網友回復:
謝謝,我的基本想法是這個服務器不要只是做項簡單的服務,所以我才有這樣子設計的想法,目前做的在應付著用的“破”服務器實作了傳遞一點簡單的資訊和檔案更新服務,當然,我知道如果加入資料集傳遞,作業難度還很大。
設計的思路是:
1. 客戶端發送命令,命令字串中帶入了需求的服務和命令以及引數
2. 服務器回應并分析命令,根據需求呼叫不同的服務,再把命令和引數傳遞給該服務
3. 在服務中根據命令和引數具體執行具體任務,回傳需要傳遞的內容給客戶端
我比較疑惑的地方在意,要怎么定義一套傳輸“協議”出來,使得每個任務不會都是特殊發送接收次序
uj5u.com熱心網友回復:
如果要做到客戶端可以被動接受服務器傳遞的訊息和內容,在客戶端增加一個 server 監聽埠是比較好的選擇吧?否則是不是只能定時主動發訊息給服務器輪詢了?uj5u.com熱心網友回復:
indy的server控制元件絕對是動態多執行緒的。uj5u.com熱心網友回復:
其實你完全不用那樣來做,定義幾個Record就可以了
比如:
CMD=(cLogin, cUserList);
TLogin=record
UserName,
Password:string[255];
end;
TUserList=record
UserList:array[0..1024] of char;
end;
資料包這樣
命令名,資料長度,資料,校驗.
uj5u.com熱心網友回復:
indy不論是server,還是client在發包的模塊,對呼叫者都是異步的
即使他內部可能用的是同步socket模式
uj5u.com熱心網友回復:
lz的想法是對的。細節的話,建議直接讀indy原始碼。這里問不出啥的。indy是采用阻塞式socket模型,也就是直到send或recv執行完成,否則函式不會回傳。
indy的的服務器實作中采用多執行緒+阻塞,也就是說send和recv是相對于他所在的執行緒而言。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/131883.html
標籤:網絡通信/分布式開發
下一篇:delphi grid 報表求救
