2015-07-12 50 views
1

我遇到了一個python腳本問題我沒有寫自己,我完全是python的新手。腳本在Raspberry Pi上運行,並在端口8080(套接字)上偵聽。客戶端可以發送諸如「rebo​​ot()」之類的命令。問題是當客戶端關閉連接時,腳本不再接受新的連接並執行該命令。Python Socket不斷監聽並接受新客戶端

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
s.bind(("", 8080)) 
s.listen(1) 
conn = s.accept() 

while True: 
data = conn[0].recv(1024) 
if data: 
    command = "" 
    args = "" 
    if "(" in data and ")" in data: 
     command = data[:data.index("(")] 
     args = data[data.index("(") + 1:data.index(")")] 
    if "," in args: 
     arglist = args.split(",") 
    else: 
     arglist = args 

    if command == "reboot": 
     os.system("reboot") 
    elif command == "shutdown": 
     os.system("shutdown -h now") 
    elif command == "reset": 
     obja.reset() 
     objb.reset() 
    else: 
     conn[0].sendall("Command doesn't exist!") 

腳本在啓動時運行並且不終止。這裏的最後一行也是原始腳本的最後一行。我發佈的代碼上面還有一些代碼,但我認爲它不適用於套接字問題。我嘗試將While循環中的前5行放入,但不起作用。 我應該如何重新編寫代碼,以便在客戶端關閉連接時繼續運行?任何幫助是非常受歡迎的。

彼得

+0

可能是因爲你不是'close('s.close()')連接以及.. –

+0

不完全一樣,但邏輯相似http://stackoverflow.com/questions/31357762/蟒-子 - 變化 - DIR-通客戶端 - 服務器/ 31359402#31359402 –

回答

1

你需要把在while循環中的代碼開始conn = s.accept()

您只想設置套接字並調用bind/listen一次。但是,您確實需要捕獲例外,例如ConnectionClosed,並在發生這種情況時再次致電accept。要做到這一點,您將要包裝在try/except中添加的新while循環的主體。 except塊將需要捕獲客戶端失去連接時發生的任何類型的異常。

祝你好運,快樂的編碼!

相關問題