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