首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ListView a client connection中存储标识符- Indy 10

如何在ListView a client connection中存储标识符- Indy 10
EN

Stack Overflow用户
提问于 2011-12-04 01:34:10
回答 2查看 1.2K关注 0票数 1

我正在创建一个TCP服务器,它接收多个客户端,并且必须能够向每个客户端发送消息。

如何获得客户端连接的句柄,然后发送任意数据?

谢谢:D

代码:

代码语言:javascript
运行
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-05 09:07:16

使用:

代码语言:javascript
运行
复制
AContext.Connection.IOHandler.Write( (* bytes *) );
AContext.Connection.IOHandler.WriteFile( (* send a file to the client *) );

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

票数 1
EN

Stack Overflow用户

发布于 2011-12-05 13:09:30

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8369543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档