从 ThreadingTCPServer 正常关闭
我创建了一个运行 ThreadingTCPServer 的简单测试应用程序(Python 2.6.1),基于示例 此处。如果客户端发送命令“再见”,我想关闭服务器并从应用程序中干净退出。退出部分工作正常,但是当我尝试重新运行应用程序时,我得到:
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.")
I've created a simple test app (Python 2.6.1) that runs a ThreadingTCPServer, based on the example here. If the client sends a command "bye" I want to shut down the server and exit cleanly from the application. The exit part works OK, but when I try to re-run the app, I get:
socket.error: [Errno 48] Address already in use
I tried the solution given here for setting the socket options but that didn't seem to help. I've tried various ways to close the server down, but always get the same error.
Any idea what I'm doing wrong?
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.")
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您还没有找到答案,我相信这可能会有所帮助...
如何关闭被杀死的程序打开的套接字?
但是,这与 Alex 提供的解决方案相同,所以也许这只是一个关闭老问题的机会。
If you have not already found an answer, I believe this may assist...
How to close a socket left open by a killed program?
However, this is the same solution offered by Alex, so perhaps this is just an opportunity to close an old question.