【问题标题】:How to listen on a port and broadcast from another at the same time? Python如何同时监听一个端口并从另一个端口广播? Python
【发布时间】:2016-06-14 05:55:56
【问题描述】:

我有一个 python 脚本,它非常适合监听端口上的 UDP 数据包。 我已经知道如何广播 UDP 数据包,但我的软件设计要求我能够监听 UDP 数据包并同时广播它们。

如何在程序继续运行的同时在一个端口上侦听 UDP 数据包,最终导致数据包广播?

简单地说,我想要我的聆听循环......

    print("Listening on port: " + str(self.recvPort))
    while 1:
        data = inSoc.recv(65536)  # 16 bytes
        # Recived some data from the server, Can PROCCESS NOW!
    if not data:
        pass
    else:
        print("Data has arrived!")
        print("[Data] : ", data)

...在脚本继续执行其他任务的同时在后台持续运行,其中一项是在不同的端口上广播。

我知道这应该与线程、_thread 或异步有关,但是我无法让这些工作?

我将循环命名为 async def,但由于没有 await 而失败

【问题讨论】:

  • 我想说你真的应该看看芹菜。如果它必须在单个脚本中,则需要使用单独的处理器,因为某些操作可能会阻塞。如果您必须在两者之间共享状态,那么您需要使用类似 manager dict 的东西。
  • 我绝对希望它在同一个脚本中
  • 那么您将不得不运行单独的处理器(感谢 gil),但使用经理 dict docs.python.org/2/library/… 这应该没什么大不了的。

标签: python sockets asynchronous python-3.5


【解决方案1】:

您本来就不需要线程来解决这个问题。 我想你应该看看 select https://docs.python.org/2/library/select.html

那么你可以这样做:

while 1:
    read, _, _ = select.select([inSoc],[],[], 0)
    #if insoc has something for you to read
    for soc in read:
        data = soc.recv(65536)
    #do something else

【讨论】:

  • 这看起来不错。只是为了让我能理解你的代码。 read 将包含任何数据包的排队对象,如果队列中没有数据包,它会继续 while 循环吗?
  • read 将包含一个套接字列表,这些套接字可以被读取,也就是已经收到了一些东西。因为我们只发送 insoc,这意味着 read 要么是空的,要么包含 insoc。然后对于每个有东西要读取的套接字(也就是 none 或 insoc),我们做 recv。之后我们在循环之前做一些其他的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2013-06-17
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
相关资源
最近更新 更多