Python macOS Socket编程:P2P网络TCP连接异常排查求助
问题分析与解决方案
核心错误原因
- 服务端代码犯了一个关键错误:用于监听连接的TCP套接字(
tcp_socket)不能直接用来收发数据。accept()方法返回的connection对象才是和客户端建立好的连接套接字,所有读写操作都必须通过这个connection完成。 - 你现在调用
tcp_socket.recv(),会触发OSError: [Errno 57] Socket is not connected——因为监听套接字本身处于未连接状态,根本无法接收数据。 - 服务端的这个错误会直接导致连接被强制重置,客户端因此收到
ConnectionResetError: [Errno 54] Connection reset by peer。
修正后的服务端代码
tcp_socket = socket(AF_INET, SOCK_STREAM) tcp_socket.bind(('127.0.0.1', port)) tcp_socket.listen(3) while True: connection, client_addr = tcp_socket.accept() # 必须用accept返回的connection套接字处理数据 filename = connection.recv(1024).decode() print('request from', client_addr, ': ', filename) # 补充响应客户端的逻辑(比如返回文件内容) connection.send('sample file content'.encode()) connection.close() # 处理完请求后关闭连接
额外说明
- 同一端口同时跑UDP和TCP是完全合法的,操作系统会通过协议类型区分不同套接字,这部分逻辑没问题。
- 客户端代码可以保留,但建议加一层异常处理,避免因连接异常直接崩溃。
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

