2013-06-11 163 views
0

我試圖播放一些數據並使用python接收數據。 這是我想出的代碼。使用Python廣播和接收數據

from socket import * 
import threading 

class PingerThread (threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 

    def run (self): 
     print 'start thread' 
     cs = socket(AF_INET, SOCK_DGRAM) 
     cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
     cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) 
     cs.sendto('This is a test', ('192.168.65.255', 4499)) 

a = PingerThread() 
a.start() 

cs = socket(AF_INET, SOCK_DGRAM) 
data = cs.recvfrom(1024) # <-- waiting forever 

但是,代碼似乎永遠在cs.recvfrom(1024)等待。什麼可能是錯誤的?

+1

難道你不得不告訴你在哪裏聽的插座嗎? –

+0

你可能想看看http://docs.python.org/2/library/socketserver.html,它很好地覆蓋了這個應用程序與一個非常薄的糖層。 – synthesizerpatel

回答

1

您的線程可能會在之前發送其數據您開始收聽。

添加一個循環,你的線程停止問題

from socket import * 
import threading 
import time 

class PingerThread (threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 

    def run (self): 
     for i in range(10): 
      print 'start thread' 
      cs = socket(AF_INET, SOCK_DGRAM) 
      cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
      cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) 
      cs.sendto('This is a test', ('192.168.1.3', 4499)) 
      time.sleep(1) 

a = PingerThread() 
a.start() 


cs = socket(AF_INET, SOCK_DGRAM) 
try: 
    cs.bind(('192.168.1.3', 4499)) 
except: 
    print 'failed to bind' 
    cs.close() 
    raise 
    cs.blocking(0) 
data = cs.recvfrom(1024) # <-- waiting forever 
print data 
+0

在我的Mac上,它可以開啓和關閉。 netcat不起作用。 – prosseek

2

有在代碼中的三個問題。

  1. 該監聽器沒有任何約束力。
  2. 打開的插座未關閉。
  3. 有時,線程產生得如此之快以至於偵聽器只是錯過了廣播數據。

這是修改後的工作代碼。

from socket import * 
import time 
import threading 

port = 4490 
class PingerThread (threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 

    def run (self): 
     print 'start thread' 
     cs = socket(AF_INET, SOCK_DGRAM) 
     cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
     cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) 

     time.sleep(0.1) # issue 3 solved 
     cs.sendto('This is a test', ('192.168.65.255', port)) 

a = PingerThread() 
a.start() 

cs = socket(AF_INET, SOCK_DGRAM) 
try: 
    cs.bind(('192.168.65.255', port)) # issue 1 solved 
except: 
    print 'failed to bind' 
    cs.close() 
    raise 
    cs.blocking(0) 

data = cs.recvfrom(20) 
print data 
cs.close() # issue 2 solved 
+0

你打敗了我。 – brice