簡體   English   中英

Delphi Indy TCP客戶端/服務器通信最佳方法

[英]Delphi Indy TCP Client/Server communication best approach

我有一個客戶端和一個可以正常通信的服務器應用程序,服務器中有一個TIdCmdTCPServer,客戶端中有一個TIdTCPClient。

客戶端必須在服務器中進行身份驗證,客戶端向服務器詢問最新版本信息,並下載所有更新和其他通信。 與TIdTCPClient.SendCmd()和TIdTCPClient.LastCmdResult.Text.Text的所有通信。

這樣,服務器接收命令和答復,客戶端僅接收答復,而不接收命令,我想實現一種使客戶機接收命令的方法。 但是據我所知,如果客戶端使用SendCmd,則它永遠不應監聽ReadLn()之類的數據,因為它將干擾SendCmd中預期的答復。 我想到要制作一條命令來檢查命令,例如,客戶端將發送“ IsThereCommandForMe”之類的命令,而服務器將向每個客戶端發送命令池,並且當客戶端提出要求時,服務器會在答復中發送該命令,但是我認為這不是一個好方法,因為在可用命令與客戶端要求之間會有很大的延遲。 我還考慮過與新組件(例如TIdCmdTcpClient)建立新連接,但是每個客戶端將有2個連接,我不喜歡這種想法,因為我認為它很容易在通信中引起問題。

我想要這個的原因是,我想在客戶端中實現聊天功能,並且它應該一直從服務器接收消息,而無需一直詢問,想象所有客戶端不斷向服務器詢問是否有消息。 而且我希望能夠在有可用更新時通知客戶端,而不是客戶端詢問是否有更新。 這樣,我也可以向客戶端發送更多命令。

您對此有何看法? 我如何使服務器從客戶端接收命令,但同時發送命令呢?

TCP套接字在設計上是雙向的。 一旦建立了“客戶端”和“服務器”之間的連接,它們是對稱的,並且可以隨時從同一端的任何一側發送數據。

它僅取決於使用哪種通信模型的協議(對於通信而言,該協議只是寫為“合同”)。 例如,HTTP使用請求/回復模型。 例如,使用Telnet,雙方都可以啟動數據傳輸。 (如果您看一下Telnet的Indy實現,您會發現它使用后台線程來偵聽服務器數據,但是它在主線程中使用相同的套接字連接來將數據從客戶端發送到服務器)。

WebSockets是“全雙工”協議,它支持請求/響應和服務器推送,並且對防火牆也友好。 使用WebSockets(HTTP升級),服務器可以隨時將數據發送到連接的客戶端。 這將滿足您的“聊天”要求。

如果使用TIdTCPClient / TIdCmdTCPServer,公司防火牆可能會阻止通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM