2016-03-01 41 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