indy和socket的一些區別

1.
下面比較一下serverSokcet與clientSocket和idTcpServer與idTcpClient兩組通訊組件的異同:

socket即支持同部傳送數據又支持異步傳送數據。而idtcp則只支持同步傳送數據。

serverSokcet與clientSocket是非阻塞式的,基於事件觸發的。  


idTcpServer與idTcpClient是阻塞式的,基於多線程的。

idTcpServer爲每個連接的用戶建立一個單獨的線程,編程比較方便。

用indy作完成端口,經過壓力測試,發現可以承受600個併發用戶,當然這個與個人編程水平有關,做不好,100以上併發用戶都難接受

2.
問:一個網絡系統,在客戶端相互信息發送時,同時要求記錄保存到服務器的數據庫裏,請教服務器端/客戶端分別用INDY的具體哪個控件比較合理?

答:IDTCPClient/IDTCPServer/IDUDPClient/IDUDPServer均可。主要看具體應用要求

IDTCPClient/IDTCPServer會在運行時建立一個長時連接,直到退出;IDUDPClient/IDUDPServer則只管往指定的IP和端口發數據,能否收到由網絡來決定。它們消耗的資源也是有所區別。

3.
tcpclient tcpserver和 idtcpclient idtcpserver不是同一個控件,再D7中,
他們分屬在不同的模板(intenet,indy client,indy server),也有着不同的屬性、方法和事件。
另外,intenet的tcpserver在接收數據是自動建立線程觸發onAccept事件,因此必須要在此事件建立一個線程,可參考demo中的netchat例子。

1.阻塞模式編程建議用INDY的IDTCPCLIENT IDTCPSERVER
2.非阻塞模式建議用D6中的CLIENTSOCKET SERVERSOCKET,D7中可以通過 COMPONENT->
INSTALL PACKAGES->add->DELPH7\BIN\DCLSOCKETS70.BPL來添加。
3.TCPCLIENT,TCPSERVER在D7中的DEMOS是用的阻塞模式,當客戶端連接後建立了線程來處理和客戶端的通訊問題。BLOCKMODE:=BMTHREADBLOCKING;
4.TCPCLIENT,TCPSERVER也可以工作在非阻塞模式,BLOCKMODE:=BMNOBLOCKING;這樣就象CLIENTSOCKET SERVERSOCKET了,但是TCPCLIENT 可以象CLIENTSOCKET一樣又ONREAD,ONWRITE,而TCPSERVER確沒有看到象SERVERSOCKET那樣的ONCLIENTREAD,ONCLIENTREAD.
5.查看TCPSERVER的源代碼,發現他和TCPCLIENT一樣最終是繼承於TBaseSocket的,那麼應該也可以有ONREAD,ONWRITE。
6.如果我們象TCPCLIENT那樣作個procedure TcpServerReceive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer),你面寫處理代碼,然後TCPSERVER1.OnReceive:=TcpServerReceive; OnSend也如此類推,應該就可以了。

7.這個方法沒有測試,但原理是這樣的,只不過TCPSERVER的OnReceive,OnSend在設計時看不到而已,不等於他沒有。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章