1

我正在创建一个接收多个客户端并且必须能够向每个客户端发送消息的 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;
4

2 回答 2

2

TIdTCPServer是一个多线程组件。直接从其OnConnect事件(或OnDisconnectOnExecuteOnException)中访问 UI 不是线程安全的!您需要使用 Indy 的TIdSyncTIdNotify类来安全地访问 UI。

要回答最初的问题,最简单但不一定最安全的方法是将TIdContext.Connection对象指针存储在TListItem.Data属性中。然后,主线程代码将在需要时直接访问连接。

不过,我不建议这样做。更安全的解决方案是自己唯一标识每个客户端,例如使用客户端发送的用户名,并将该 ID 存储在TIdContext.DataTListItem.Data属性中。然后,当您的主线程代码想要向客户端发送消息时,它可以遍历TIdTCPServer.Contexts列表以查找所需的 ID,如果找到,则可以访问相应的TIdContext.Connection对象。

于 2011-12-05T05:09:29.643 回答
1

采用:

AContext.Connection.IOHandler.Write( (* bytes *) );
AContext.Connection.IOHandler.WriteFile( (* send a file to the client *) );

如需更多选项,只需在 IOHandler 之后调用代码完成(CTRL+SPACE)并查看可用选项,前段时间,我编写了一个简单的客户端/服务器测试应用程序,单击此处查看和/或下载源代码。

于 2011-12-05T01:07:16.090 回答