2013-03-13 58 views
0

我想創建一個python套接字(或套接字服務器),一旦連接到單個設備,維護一個開放的連接,以便進行定期檢查,看看是否有數據已經送走了。套接字只會偵聽一個連接。維護套接字連接,不規則的數據頻率

例如爲:

def get_data(conn): 
    response='back atcha' 
    data = conn.recv(1024) 
    print 'get_data:',data 
    if data: 
     conn.send(response) 

s = open_socket() 
conn, addr = s.accept() 
while True: 
    print 'running' 
    time.sleep(1) 
    get_data(conn) 
    #do other stuff 

一旦服務器套接字綁定和連接已被接受,運行插座塊時一個.recv直到連接的客戶端發送一些數據或關閉其插座。由於我正在等待不規則數據(可能是秒,可能是一天),並且程序需要在此期間執行其他任務,所以這種阻塞是一個問題。

我不希望客戶端關閉其套接字,因爲它可能需要隨時向服務器發送(或接收)數據。是在單獨的線程中運行這個唯一的解決方案,還是有一種簡單的方法來設置客戶端/服務器套接字永久保持連接(並且這是安全的?它將在VLAN上運行),而不會阻塞數據已收到?

回答

1

您正在尋找非阻塞I/O,也稱爲異步I/O。使用一個單獨的線程阻塞這是非常低效的,但它非常簡單。

對於Python異步I/O框架,我強烈推薦Twisted。同時檢查出標準庫附帶的asyncore

+1

非阻塞I/O和異步I/O是兩件不同的事情。 – EJP 2013-03-13 22:15:42

+0

Look [here](http://stackoverflow.com/questions/16745409/what-does-pythons-socket-recv-return-for-non-blocking-sockets-if-no-data-is-r)例子如何使用非阻塞套接字。 – Armali 2014-06-06 12:14:11