我正在创建一个TCP服务器,它可以接收多个客户端,并且必须能够向每个客户端发送消息。
如何获得客户端连接的句柄,然后发送任意数据?
谢谢:D
代码:procedure TFRM_Main.ServerConnect(AContext: TIdContext);
var lAdd: TListItem;
var Index: integer;
begin
lAdd := ListView.Items.Add;
//AContext connection ID, what to do here?
lAdd.Caption := IntToStr(Index);
end;
TIdTCPServer
是一个多线程组件。直接从其OnConnect
事件(或OnDisconnect
、OnExecute
或OnException
)访问UI不是线程安全的!您需要使用Indy的TIdSync
或TIdNotify
类才能安全地访问UI。
要回答最初的问题,最简单但不一定最安全的方法是将TIdContext.Connection
对象指针存储在TListItem.Data
属性中。主线程代码将在需要时直接访问该连接。
我不建议那样做。更安全的解决方案是自己唯一地标识每个客户端,例如使用客户端发送的用户名,并将该ID存储在TIdContext.Data
和TListItem.Data
属性中。然后,当主线程代码想要向客户端发送消息时,它可以通过TIdTCPServer.Contexts
列表循环查找所需的ID,如果找到了,那么它将访问相应的TIdContext.Connection
对象。
use:
AContext.Connection.IOHandler.Write( (* bytes *) );
AContext.Connection.IOHandler.WriteFile( (* send a file to the client *) );
更多的选项,只需调用代码完成(CTRL+SPACE) IOHandler之后,看到可用的选项,前一段时间,我写了一个简单的客户端/服务器测试应用程序,点击这里查看和/或下载源代码。