客户端连接时 ThreadingTCPServer 不会退出
ThreadingTCPServer won't exit when client connected
我是 运行 一个简单的 echo 套接字服务器,只要有客户端连接,ctrl C 就不会 exit/terminate 服务器。相反,它 "hangs" 直到客户端与套接字断开连接。我在某处读到这是因为即使在主线程终止后仍有一个线程处于活动状态。我该如何解决这个问题?
Python 代码(请原谅一些缩进,它没有很好地复制粘贴):
import SocketServer
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
import sys
import time
import socket
import os
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
pass
class RequestHandler(StreamRequestHandler):
def handle(self):
print str(self.client_address) + 'connected'
data = "foo"
while data != "":
try:
data = self.rfile.readline().rstrip('\n')
except:
self.request.close()
print 'Socket Error'
break
print data
try:
self.wfile.write("OK\n")
except socket.error:
data = ""
print 'Handler Exiting'
self.request.close()
def finish(self):
print 'Client ' + str(self.client_address) + ' Disconnected'
if __name__ == '__main__':
PORT = 80
print 'Starting Server on port: ' + str(PORT)
ThreadingTCPServer.allow_reuse_address = True
server = ThreadingTCPServer(("", PORT), RequestHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
print "\nServer Terminated"
server.shutdown()
sys.exit()
感谢所有回复,感谢您的宝贵时间!
尝试在程序开始时这样做:
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
它的作用是将Ctrl-C(SIGINT)恢复到之前的默认值,即立即终止程序。
我是 运行 一个简单的 echo 套接字服务器,只要有客户端连接,ctrl C 就不会 exit/terminate 服务器。相反,它 "hangs" 直到客户端与套接字断开连接。我在某处读到这是因为即使在主线程终止后仍有一个线程处于活动状态。我该如何解决这个问题?
Python 代码(请原谅一些缩进,它没有很好地复制粘贴):
import SocketServer
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
import sys
import time
import socket
import os
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
pass
class RequestHandler(StreamRequestHandler):
def handle(self):
print str(self.client_address) + 'connected'
data = "foo"
while data != "":
try:
data = self.rfile.readline().rstrip('\n')
except:
self.request.close()
print 'Socket Error'
break
print data
try:
self.wfile.write("OK\n")
except socket.error:
data = ""
print 'Handler Exiting'
self.request.close()
def finish(self):
print 'Client ' + str(self.client_address) + ' Disconnected'
if __name__ == '__main__':
PORT = 80
print 'Starting Server on port: ' + str(PORT)
ThreadingTCPServer.allow_reuse_address = True
server = ThreadingTCPServer(("", PORT), RequestHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
print "\nServer Terminated"
server.shutdown()
sys.exit()
感谢所有回复,感谢您的宝贵时间!
尝试在程序开始时这样做:
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
它的作用是将Ctrl-C(SIGINT)恢复到之前的默认值,即立即终止程序。