【问题标题】:How to store an identifier in a ListView a client connection - Indy 10如何在 ListView 中存储标识符与客户端连接 - Indy 10
【发布时间】:2011-12-03 17:34:09
【问题描述】:

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

【问题讨论】:

  • @DorinDuminica 准备就绪,已添加代码!

标签: delphi delphi-xe delphi-xe2 indy10


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    使用:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多