首先在Indy 10的delphi中从服务器开始通信

Far*_* H. 2 delphi tcp client-server indy tthread

在由TCPServer/Client组件编程的Socket应用程序中,通常我们是活动服务器端,然后将客户端连接到服务器,当我们需要从一侧获取或发送数据到另一端时,首先我们从客户端向服务器发送命令并且通信将是开始.

但问题是我们总是需要从客户端开始对话!

我想问一下,在没有客户端请求的情况下从服务器端随机开始会话是否有任何想法?

我需要此功能从服务器端通知客户端.例如,当注册用户(客户端)连接到服务器,其他连接用户(在其他客户端)时,通知必须从服务器发送给所有用户(如Yahoo Messenger).

我正在使用TIdCmdTCPServerTIdTCPClient组件

Rem*_*eau 8

你正在使用TIdCmdTCPServer.根据定义,它会向客户端发出的命令发送响应.对于你所要求的,你应该使用TIdTCPServer,然后你可以在TIdTCPServer.OnExecute活动中做任何你想做的事情.

您要求的是可行的,但其实现取决于您对协议的特定需求.

如果您只想发送未经请求的服务器到客户端消息,并且从不响应客户端到服务器命令,那么实现非常简单.用TIdContext.Connection.IOHandler在需要的时候.您可以遍历TIdTCPServer.Contexts列表中的现有客户端,例如内部TIdTCPServer.OnConnectTIdTCPServer.OnDisconnect事件.在客户端,您需要定时器或线程来定期检查服务器消息.看看TIdCmdTCPClientTIdTelnet举例说明.

但是,如果需要在同一连接上混合客户端到服务器命令和未经请求的服务器到客户端消息,则必须将协议设计为异步工作,这使得实现更加复杂.未经请求的服务器消息可以随时出现,甚至可以在响应客户端命令之前出现.命令需要包含在响应中回显的值,以便客户端可以匹配响应,并且数据包需要能够区分响应和未经请求的消息.您还必须在服务器端为每个客户端提供自己的出站队列.您可以使用该TIdContext.Data属性.然后,您可以在需要时将服务器消息添加到队列,并让OnExecute事件在没有执行任何其他操作时定期发送队列.您仍然需要客户端上的计时器/线程,它需要处理客户端命令和未经请求的服务器消息的响应,因此您不能使用TIdConnection.SendCmd()或相关的方法,因为它不会知道它最终会读取什么.

我曾多次在Embarcadero和Indy论坛上发布这两种方法的例子.