【问题标题】:How To Send Data To Multiple Clients From A Queue如何从队列中向多个客户端发送数据
【发布时间】:2017-09-22 20:12:24
【问题描述】:

我正在使用 Python 开发一个小型编程游戏/环境,以帮助我的弟弟学习编码。它需要在网络上运行,我是网络编程的新手。我将解释游戏的概念,以便有人可以为我指明最佳方向。

这个想法是一个简单的 25x25“二极管”网格,具有固定位置和可编辑颜色值的正方形,基本上模拟了一个非常小的屏幕。除了网格显示之外,还有一个命令窗口,可以在其中输入 Python 代码并将其发送到InteractiveConsole 的实例,以及一个聊天窗口。客户端需要能够向主机发送 Python 命令,主机将运行代码,然后以字符串形式接收表示网格更改的输出。我这样做的概念包括在主机端维护传入和传出事件的队列,以处理各个线程上的客户端并将其中继到客户端。任何给定的命令/聊天事件都将发送到主机并转发给所有客户端,包括创建事件的客户端,以便所有客户端在其命令/聊天窗口中都可以看到这些事件。由于处理源自客户端的命令,对网格的所有更改都将源自主机,并且还将发送给所有客户端。

我主要不明白的是如何在所有客户端之间进行同步,即如何知道队列中的给定项目何时已成功发送给所有客户端,然后再将其从队列中清除,因为任何单独的线程都会这样做过早地会阻止该项目被发送给其他客户。这是一个非常开放的问题,因为我知道在准备实施之前我肯定需要使用一些学习材料。我不是要一个具体的解决方案,而是要一些关于在我的情况下可以使用什么通用类型的解决方案的指导。我是在业余时间做这件事的,所以我不想花一个月的时间阅读那些没有为我指明适用于这个项目的方向的网络教程。

【问题讨论】:

  • 我会研究zeromq,他们拥有的 pubsub 模型似乎很适合这个。
  • 但总的来说,这是一个非常难以回答的问题,可以采用多种方法。

标签: python multithreading networking server multicast


【解决方案1】:

我的方法是使用可以广播到多个客户端的 udp 服务器。所以基本上,所有客户端都会在游戏会话期间连接到该服务器,并且服务器会在游戏状态更新时将游戏状态广播给客户端。由于您的游戏相对简单,这种方法将为您提供实时更新。

【讨论】:

  • 当您说“广播”时,这与普通的send()/recv() 关系有很大不同吗?
  • 广播只能用于局域网上的每个主机都需要接收消息的情况。在这种情况下使用多播是合适的。
  • @MaxPaymar @RonMaupin 好的,所以我想我从this 问题上关于多播的答案中得到了要点。据我所知,设置了一个 UDP 多播套接字以传输到在给定端口上侦听的所有套接字,因此 socket.sendto(...) 的一次执行将向所有侦听套接字发送相同的数据,而无需线程看起来.看起来对吗?
  • 是的,每个监听多播组套接字的客户端都会收到数据。
  • @Rammschnev,想要收听多播的主机订阅了多播组。组播源以组播组为目的IP地址发送一条消息,每个订阅组播组的主机都会收到该消息。
猜你喜欢
  • 2012-03-10
  • 2015-01-08
  • 2018-01-15
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 2017-05-07
相关资源
最近更新 更多