2013-12-12 251 views
0

我想寫打印發送給它的數據,或者退出,如果數據是「跳槽」,「退出」或「停止」一個簡單的服務器程序:套接字連接不會關閉?

HOST = "" 
PORT = 37720 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind((HOST, PORT)) 
server.listen(1) 

while(1): 
    conn, addr = server.accept() 

    data = conn.recv(1024) 
    if not data: break 

    inData, inUrl = json.loads(data) 

    if inData == "quit" or inData == "exit" or inData == "stop": 
     print("Quitting") 
     conn.close() 
     break 
    else: 
     conn.send("Received") 
     print(inData) 

它做什麼,我期待,只是當我嘗試一旦它的退出再次運行服務器,我得到:

Traceback (most recent call last): 
    File "./s", line 14, in <module> 
    server.bind((HOST, PORT)) 
    File "/usr/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
socket.error: [Errno 98] Address already in use 

我想這意味着連接沒有關閉。我如何關閉它以防止這種情況發生?我嘗試了conn.close(),但它沒有解決任何問題。

+1

作爲一個便箋,您的代碼確實沒有工作。 [套接字是字節流,而不是消息流](http://stupidpythonideas.blogspot.com/2013/05/sockets-are-byte-streams-not-message.html)。沒有理由相信你從'conn.recv'返回的每個緩衝區都是單個消息;它可能是一條消息,或六條單獨的消息。它可以在本地主機上進行簡單的測試,但是在真正部署它時(或者更糟糕的是,會在1%的時間內失敗,僅僅使其無效但不足以進行調試)失敗90%。 – abarnert

回答

3

您需要設置SO_REUSEADDR標誌。

server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)