"socketserver" 应用在退出时未释放套接字
我在Debian 13系统上用Python3运行下面的程序,以测试 socketserver 包:
#!/usr/bin/env python3
import sys
import socketserver
prog = None
host = '0.0.0.0'
port = 12345
def main():
with socketserver.TCPServer((host, port), MyTCPHandler) as server:
server.serve_forever()
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
pieces = [b'']
total = 0
while b'\n' not in pieces[-1] and total < 10_000:
pieces.append(self.request.recv(2000))
total += len(pieces[-1])
self.data = b''.join(pieces)
print(f"Received from {self.client_address[0]}:")
print(self.data.decode("utf-8"))
self.request.sendall(self.data.upper())
# sys.exit(0)
if __name__ == '__main__':
sys.exit(main())
程序运行良好,但当我通过Ctrl-C退出该程序时,套接字不会立即释放。我需要等待一段时间,直到该套接字实际关闭。
此外,如果我把 sys.exit(0) 语句取消注释,并且在完成一次请求后退出,套接字也不会立即释放。
想要在退出时让这个程序实际释放套接字,无论退出是由信号引发,还是仅仅通过 sys.exit(0) 退出,应该怎么做?
解决方案
根据Tim Roberts的注释,事实证明,在实例化BaseRequestHandler类之前,需要以下内容:
socketserver.TCPServer.allow_reuse_address = True
我把那条语句作为我的 main() 例程的第一行插入,现在退出后套接字确实会立即消失。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。