2010-06-29 96 views
3

我已经创建了一个基于示例here运行ThreadingTCPServer的简单测试应用程序(Python 2.6.1)。如果客户端发送命令“再见”,我想关闭服务器并从应用程序中彻底退出。出口部分工程确定,但是当我尝试重新运行应用程序,我得到:从ThreadingTCPServer中正常关闭

socket.error: [Errno 48] Address already in use 

我试过设置套接字选项给出here的解决方案,但似乎并没有帮助。我试过各种方法关闭服务器,但总是得到相同的错误。

任何想法我做错了什么?

import SocketServer 
import socket 
import sys 
import threading 
import time 

class RequestHandler(SocketServer.BaseRequestHandler): 

    def setup(self): 
     print("Connection received from %s" % str(self.client_address)) 
     self.request.send("Welcome!\n") 

    def handle(self): 
     while 1: 
      data = self.request.recv(1024) 
      if (data.strip() == 'bye'): 
       print("Leaving server.") 
       self.finish() 
       self.server.shutdown() 
       # None of these things seem to work either 
       #time.sleep(2) 
       #del self.server.socket 
       #self.server.socket.shutdown(socket.SHUT_WR) 
       #self.server.socket.close() 
       #self.server.server_close() 
       break 


    def finish(self): 
     self.request.send("Goodbye! Please come back soon.") 

if __name__ == "__main__": 
     server = SocketServer.ThreadingTCPServer(("localhost", 9999), RequestHandler) 
     # This doesn't seem to help. 
     #server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) 
     #server.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     server.serve_forever() 
     print("Exiting program.") 
+0

当程序关闭并再次启动时,您需要等待多长时间? – 2010-06-29 03:28:49

+0

只需几秒钟。如果我等一两分钟,TCP套接字就会释放,一切正常。 – Lynn 2010-06-29 04:10:20

+0

轻微更新。我能够通过这样做获得重用地址位: SocketServer.ThreadingTCPServer.allow_reuse_address = True 但我仍不明白为什么服务器没有被清理干净。 – Lynn 2010-06-29 04:11:44

回答