Delphi Indy TCP客户端/服务器通信的最佳方法

时间:2015-04-12 13:02:53

标签: sockets delphi tcp communication indy

我有一个正常通信的客户端和服务器应用程序,服务器中有一个TIdCmdTCPServer,客户端中有一个TIdTCPClient。

客户端必须在服务器中进行身份验证,客户端要求服务器提供最新版本信息并下载任何更新和其他通信。所有这些都与TIdTCPClient.SendCmd()和TIdTCPClient.LastCmdResult.Text.Text进行了沟通。

就是这样,服务器接收命令和回复,客户端只接收回复,从不接收命令,我想实现一种让客户端接收命令的方法。但正如我所听到的,如果客户端使用SendCmd,它应该永远不会监听像ReadLn()这样的数据,因为它会干扰SendCmd中预期的回复。   我想做一个检查命令的命令,例如,客户端会发送一个命令,如“IsThereCommandForMe”,服务器会有一个命令池给每个客户端,当客户端要求时,服务器在回复中发送它,但我认为这不是一个好方法,因为可用命令与客户要求它之间会有很大的延迟。我还考虑过与新组件建立新连接,例如TIdCmdTcpClient,但每个客户端会有2个连接,我不喜欢这个想法,因为我认为它很容易在通信中出现问题。

我想要这个的原因是,我想在客户端实现聊天功能,它应该是从服务器接收消息而不是一直要求它,想象所有客户端不断询问服务器是否有消息对他们来说我希望能够在有可用更新时通知客户,而客户端正在询问是否有任何更新。有了这个,我也可以向客户端发送更多命令。

你对此有何看法?如何让服务器从客户端接收命令,还发送它们?

1 个答案:

答案 0 :(得分:1)

TCP套接字是双向设计。一旦建立了'client'和'server'之间的连接,它们就是对称的,并且可以随时从同一个套接字的任何一端发送数据。

它仅取决于使用哪种通信模型的协议(它只是用于通信的“合同”)。例如,HTTP使用请求/回复模型。以Telnet为例,双方都可以启动数据传输。 (如果你看一下Telnet的Indy实现,你会发现它使用后台线程来监听服务器数据,但它在主线程中使用相同的套接字连接来从客户端向服务器发送数据)。

“全双工”协议支持请求/响应和服务器推送,并且对防火墙友好,是WebSockets。使用WebSockets(HTTP升级),服务器可以随时将数据发送到连接的客户端。这符合您的“聊天”要求。

如果您使用TIdTCPClient / TIdCmdTCPServer,企业防火墙可能会阻止通信。