【问题标题】:Delphi TCP Socket Server - broadcast/reply to multiple clients at a timeDelphi TCP Socket Server - 一次广播/回复多个客户端
【发布时间】:2012-03-16 15:59:24
【问题描述】:

最近我开始开发简单的 flash(flash 仅限于 tcp)实时多人游戏,我需要一个服务器来提供客户端之间的通信。为此,我决定使用 Delphi XE + Indy,但我发现 Indy 提供了同步通信模型。 (我从未使用过任何 Indy 组件。)

到目前为止我的理解是同步(阻塞)模型限制了并发性,因此使 Indy TCP 服务器组件不适合实时多人游戏。

我的问题是:我应该使用非阻塞通信吗?实现它的最佳工具(组件、类等)是什么?

此外,如果您提供使用此工具广播消息的示例(源代码),我将非常高兴。 - 我想一次向特定“房间”的每个成员发送相同的消息(但不向其他房间的成员发送消息。)。

PS 抱歉我的英语很差(我母语不是):)

提前致谢。任何帮助表示赞赏。

【问题讨论】:

  • 除非您需要数十万个与单个服务器的活动连接,否则我认为使用非阻塞套接字架构没有任何好处。如果后来有人真正需要它,我建议使用 Francois Piette 的 Overbyte 的 ICS。然而,Indy 当然可以在任何体面的现代托管互联网服务器上处理 100、1000 或 8000 个同时连接的多人游戏服务器。

标签: delphi sockets tcp real-time broadcast


【解决方案1】:

您误解了 Indy 的工作原理。是的,它确实使用阻塞套接字,但这并不意味着它不能异步使用。 TIdTCPServer 组件是多线程的。它并行处理多个客户端连接。当然可以将消息从一个客户端发送到另一个客户端,并将消息广播到多个客户端。我之前在 StackOverflow、Embarcadero forumsIndy forum 上多次发布过此类示例。下一次,请在提问前做一些研究。

【讨论】:

  • 是的,我承认我误解了 Indy 的工作原理。但是我知道我可以使用 LockList 方法实现我想要的,但 LockList 的使用不会阻止其他线程的执行(我试图避免)?是否有替代方案?它是什么?
  • 您提出的问题相当于过早优化。实施您的服务器,并使用性能分析器对其进行分析,并对它进行负载测试并找到真正的瓶颈。还没有必要修复虚构或理论上的问题。
  • LockList() 防止同时调用 LockList() 的线程执行。其他线程可以继续运行。
【解决方案2】:

0MQ 应该适合您的需要。 0MQ 实现PGM 多播并允许请求-回复、发布-订阅、管道和独占对core patterns。不幸的是,它没有当前的 pascal/delphi 绑定。您可以在0MQ guide中找到许多(非帕斯卡)示例

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多