如何解决跨机器连接Python井字棋Socket时的ConnectionRefusedError: [WinError 10061]
排查与解决跨机器Socket连接拒绝问题(WinError 10061)
1. 修正服务端绑定地址
服务端如果使用socket.gethostbyname(socket.gethostname())绑定地址,在Windows环境下常出现解析到127.0.0.1(本地回环)的情况,导致服务仅监听本机接口,外部机器无法连接。
- 解决:将服务端绑定地址改为
0.0.0.0,让服务监听所有可用网络接口:server_socket.bind(('0.0.0.0', 5131)) - 验证:在服务端执行命令
netstat -ano | findstr :5131,确认LISTENING状态的地址为0.0.0.0而非127.0.0.1。
2. 客户端使用正确的服务端IP
跨机器连接时,客户端不能用socket.gethostbyname(socket.gethostname())(这是获取客户端自身的IP),必须指定服务端机器的实际对外IP:
- 在服务端机器通过
ipconfig(Windows)查看以太网/Wi-Fi的IPv4地址,比如192.168.1.105 - 客户端代码修改为:
client_socket.connect(('192.168.1.105', 5131))
3. 重新校验防火墙规则
- 确认服务端的防火墙规则允许入站TCP 5131连接,客户端规则允许出站TCP 5131连接
- 检查规则是否应用到当前网络环境对应的配置文件(如专用/公网网络),避免规则仅在特定网络生效
- 临时测试:关闭服务端防火墙后尝试连接,若成功则说明规则配置有误,需重新调整规则范围或优先级
4. 测试网络连通性与端口可达性
- 在客户端执行
ping 服务端IP,确认两台机器处于同一网络且能互通 - 若ping通但连接失败,执行
telnet 服务端IP 5131测试端口是否开放:- 若telnet无法连接,说明服务端未正确监听端口或中间存在拦截
- 若telnet能连接,问题可能出在Socket代码逻辑,需检查服务端的accept逻辑或客户端的连接流程
5. 确认服务端正常监听
- 服务端启动后,执行
netstat -ano | findstr :5131,确保存在LISTENING状态的条目,且对应PID为你的Python进程 - 若没有LISTENING条目,检查服务端代码的
bind和listen调用是否正常执行,有无未捕获的异常
内容的提问来源于stack exchange,提问作者Anne
相关产品推荐
相关产品推荐

