为何socket.accept()会导致已建立的未处理连接中断?
关于socket.accept()的连接维持问题
背景
我搜索了大量帖子但未找到答案。我理解socket.accept()实际是从完全连接队列中获取套接字,也知道由于阻塞IO,必须依赖并发处理多连接。
但我的问题是:socket.accept()还会执行哪些操作?它会中断已建立的连接吗?在我的实验中,我用一个线程接受新连接但不对其做任何处理——故意不调用recv(),想维持多个连接。
实验代码与现象
服务器端(Linux服务器)
import time import socket HOST = "0.0.0.0" PORT = 65432 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen() while True: conn, addr = s.accept()
客户端(MacBook)
import socket HOST = "192.168.0.104" PORT = 65432 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) while True: print('connect') s.send(b"Hello, world")
实验现象
启动服务器后,第一个客户端被阻塞;启动第二个客户端时,第一个客户端报错退出:
Traceback (most recent call last): File "/Users/home/xxx/test-client.py", line 14, in <module> s.send(b"Hello, world") BrokenPipeError: [Errno 32] Broken pipe
而第二个客户端被阻塞。
疑问
- 我期望服务器能维持多个连接,为何只有一个能持续?
- 如果
socket.accept()总会中断已建立连接,为何并发能正常工作?
问题解决
正如@Mark Tolonen的回答,原因是垃圾回收。使用以下代码片段后,我能维持多个连接:
#!/usr/bin/env python3 import time import socket HOST = "0.0.0.0" PORT = 65432 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen() connections = [] while True: conn, addr = s.accept() connections.append(conn)
吐槽
感谢各位的帮助,我想在此吐槽当前Stack Overflow的氛围。提问前我花了几天研究套接字并查阅相关问题,对某些人来说这可能很基础,但我实在不理解为何有人认为这是个糟糕的问题。对他人而言再基础的问题,对提问者来说都可能很难,唯有学习才能成长,也能帮助遇到相同问题的人。愿Stack Overflow保持开放。
内容的提问来源于stack exchange,提问作者Tengerye
相关产品推荐
相关产品推荐

