創(chuàng)建 socketserver TCP 服務(wù)器,監(jiān)聽某端口接收客戶端數(shù)據(jù)
程序斷開后(如重啟服務(wù)、kill或者ctrl+c),不能立即釋放端口,需等待每個(gè)線程tcp連接都斷開后才能重啟服務(wù)
解決方法是重寫 socketserver.ThreadingTCPServer
把變量 allow_reuse_address 設(shè)置為 True
class MyThreadingTCPServer(socketserver.ThreadingTCPServer):
"""重寫socketserver.ThreadingTCPServer"""
# 服務(wù)停止后即刻釋放端口,無需等待tcp連接斷開
allow_reuse_address = True
啟動(dòng)服務(wù)時(shí)
"""其中MyTCPHandler繼承自socketserver.BaseRequestHandler
重寫了其handle方法
"""
server = MyThreadingTCPServer((HOST, PORT), MyTCPHandler) #線程
server.serve_forever()
- ps:
如果使用 socket,可用 setsockopt 設(shè)置 SO_REUSEADDR 值為1
socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)