2016-03-01 46 views
0

我有一个python脚本,它可以很好地侦听端口上的UDP数据包。 我已经知道如何广播一个UDP数据包,但是我的软件的设计需要我能够监听UDP数据包并同时播放它们。如何在同一时间监听端口和从另一个端口进行广播? Python

如何在一个端口上侦听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

+0

我说你真的应该看看芹菜。如果它必须位于单个脚本中,则需要使用单独的处理器,因为某些操作可能会被阻止。如果你必须分享2之间的状态,那么你会想使用像经理字典。 –

+0

我最喜欢使用同一个脚本 – Harvey

+0

然后你必须运行单独的处理器(感谢gil),但是需要一个经理字典https://docs.python.org/2/library/multiprocessing.html#sharing过程之间的状态应该不是什么大问题。 –

回答

0

你不会天生需要线程来解决这个问题。 我想你应该看看选择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 
+0

这看起来不错。只是这样我才能理解你的代码。 'read'将包含任何数据包的排队对象,如果队列中没有数据包,它将继续使用while循环? – Harvey

+1

read将包含准备从中读取的套接字列表,也就是已经收到的东西。因为我们只发送inSoc,这意味着读取将是空的或包含insoc。那么对于每个需要读取内容的套接字(aka none或者insoc),我们都会recv。之后我们会在循环之前做其他事情。 – nissefors