2016-09-20 7 views
0

私はPythonには新しく、UDP接続から文字列を受け取るコードを書こうとしています。問題は2つのソースからデータを受け取る必要があることですどちらかまたは両方のデータがない場合、プログラムはループを続行しますが、ソース2のデータがない場合は、そこで停止してデータを待つか、どのように解決しますか? if文の使用について考えていましたが、受信データが空でないかどうかを確認する方法がわかりません。ソケットを使ったPython UDP通信

import socket 

UDP_IP1 = socket.gethostname() 
UDP_PORT1 = 48901 
UDP_IP2 = socket.gethostname() 
UDP_PORT2 = 48902 

sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock1.bind((UDP_IP1, UDP_PORT1)) 
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock2.bind((UDP_IP2, UDP_PORT2)) 

while True: 
    if sock1.recv != None: 
     data1, addr = sock1.recvfrom(1024) 
     data1_int = int(data1) 
     print "SensorTag[1] RSSI:", data1_int 

    if sock2.recv != None: 
     data2, addr = sock2.recvfrom(1024) 
     data2_int = int(data2) 
     print "SensorTag[2] RSSI:", data2_int 
+1

あなたはhttp://stackoverflow.com/questions/15101333/is-there-a-way-to-listen-to-multiple-python-sockets-at-once – Kafo

+1

THANKS複数のソースから受け取ることができます!誰かが既に同じ質問をして以来、もっと研究しておくべきです。 – tedhan

+0

あなたは大歓迎です。 – Kafo

答えて

1

selectあなたは常にスレッドにそれらを投げることができるあなたのために動作しない場合。共有データを注意深く見て、良いミューテックスをそれらの周りに置かなければなりません。ヘルプについては、threading.Lockを参照してください。

import socket 
import threading 
import time 

UDP_IP1 = socket.gethostname() 
UDP_PORT1 = 48901 
UDP_IP2 = socket.gethostname() 
UDP_PORT2 = 48902 

sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock1.bind((UDP_IP1, UDP_PORT1)) 
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock2.bind((UDP_IP2, UDP_PORT2)) 

def monitor_socket(name, sock): 
    while True: 
     sock.recv != None: 
      data, addr = sock.recvfrom(1024) 
      data_int = int(data) 
      print name, data_int 

t1 = threading.Thread(target=monitor_socket, args=["SensorTag[1] RSSI:", sock1]) 
t1.daemon = True 
t1.start() 

t2 = threading.Thread(target=monitor_socket, args=["SensorTag[2] RSSI:", sock2]) 
t2.daemon = True 
t2.start() 

while True: 
    # We don't want to while 1 the entire time we're waiting on other threads 
    time.sleep(1) 

注これは実行している2つのUPD源を持っていないためテストされませんでした。

+0

私はコードを感謝して、私は選択を使用して試して、それはタイムアウト引数で動作した、リストを使用していくつかの問題があったが、それは修正されました、再びありがとう! – tedhan

関連する問題