公网客户端如何连接自建socket聊天室服务器及报错解决问询
报错核心原因
你填写的公网IP不属于运行服务端程序的主机网卡,公网IP是运营商分配给路由器WAN口的地址,无法直接绑定到主机的网卡上,因此触发OSError: [Errno 99] Cannot assign requested address错误。
解决方案
1. 代码侧修正
将服务端绑定的IP地址修改为0.0.0.0,代表监听本机所有网卡的入站请求,适配所有来源的连接:
IP_Address = '0.0.0.0' PORT = 你自定义的服务端口 Address = (IP_Address, PORT) server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(Address)
如果仅需适配局域网和内网穿透工具的请求,也可以直接绑定主机的局域网IP(可通过ipconfig(Windows)或ifconfig(Linux/macOS)命令查询本机局域网IP)。
2. 路由器端口映射方案配置
- 先确认宽带拥有公网IP:登录路由器管理后台,查看WAN口IP地址,和搜索引擎搜索「我的IP」得到的结果对比,二者一致即为拥有公网IP;如果不一致可联系宽带运营商申请公网IP,说明家用监控需求即可正常获批。
- 进入路由器的「端口映射/虚拟服务器」功能页,添加映射规则:外部端口、内部端口均填写你程序监听的PORT,目标IP填写运行服务端主机的局域网IP,协议选择TCP,保存规则。
- 放开运行服务端主机的系统防火墙对应端口的入站规则,避免系统拦截连接请求。
- 互联网侧客户端填写你的公网IP+映射端口即可正常连接。
3. ngrok内网穿透方案配置
- 按上述要求修改代码后,先启动服务端程序。
- 启动ngrok执行命令:
ngrok tcp 你程序监听的PORT,ngrok会返回公网隧道地址,格式类似tcp://0.tcp.ngrok.io:12345。 - 互联网侧客户端填写返回的域名和端口(上例中域名为
0.tcp.ngrok.io,端口为12345)即可连接。 - 免费版ngrok每次重启都会变更隧道地址和端口,长期使用可自行更换支持固定地址的内网穿透工具。
注意事项
尽量选择10000以上的高位端口作为服务端口,避免运营商封禁80、443、8080等常用端口导致连接失败。
内容的提问来源于stack exchange,提问作者Vinura Yashohara
相关产品推荐
相关产品推荐

