Python Socket服务器跨网连接超时问题求助
解决Socket双人聊天程序跨网络连接超时问题(WinError 10060)
问题描述
本地运行双人聊天测试程序正常,但朋友运行client.py时出现连接超时错误,报错信息如下:
File "C:\Users\Username\Downloads\client.py", line 7, in s.connect((HOST, PORT))
TimeoutError: [WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应
相关代码
server.py
import socket HOST = socket.gethostbyname(socket.gethostname()) PORT = 65432 print(HOST) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() conn, addr = s.accept() with conn: print(f"Connected by {addr}") while True: data = conn.recv(1024) if not data: break conn.sendall(data)
client.py
import socket HOST = "我本地通过socket.gethostbyname(socket.gethostname())获取的IP" PORT = 65432 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b"Hello, world") data = s.recv(1024) print(f"Received {data!r}")
问题原因
- 服务器绑定私有IP:
socket.gethostbyname(socket.gethostname())获取的是局域网私有IP(如192.168.x.x),仅局域网内可访问,外部网络无法连接。 - 端口未映射:路由器默认阻止外部网络访问内部端口,需手动设置端口映射暴露服务端口。
- 防火墙拦截:本地Windows防火墙可能禁止了65432端口的入站连接请求。
解决方案
修改服务器绑定地址
将server.py中的HOST改为0.0.0.0,让服务器监听所有网络接口:HOST = "0.0.0.0"使用公网IP作为客户端目标地址
浏览器搜索“我的公网IP”获取你的公网IP,替换client.py中的HOST值。配置路由器端口映射
登录路由器管理后台,找到“端口映射”/“虚拟服务器”选项,添加规则:- 外部端口:65432
- 内部IP:你的本地私有IP(即原server.py输出的IP)
- 内部端口:65432
- 协议:TCP
放行防火墙入站端口
打开Windows Defender防火墙高级设置,新建入站规则:- 选择“端口”类型,下一步
- 勾选TCP,输入本地端口65432,下一步
- 选择“允许连接”,下一步
- 勾选所有适用网络类型,下一步
- 命名规则并完成
测试建议
先让朋友在同一局域网内使用你的私有IP测试client.py,确认局域网内可连接后,再处理公网连接的端口映射和防火墙配置。
内容的提问来源于stack exchange,提问作者asone _
相关产品推荐
相关产品推荐

