Python Websockets IPv6跨网络通信失败求助(同WiFi正常,已开防火墙)
跨网络WebSocket通信故障排查与解决方案
问题描述
我希望让两台接入不同网络的PC通过互联网互发消息,已在服务器PC上为端口8765创建防火墙规则。当前代码在两台设备连接同一WiFi时可正常运行,但使用不同网络连接时无法工作。
服务器(PC #1)代码
import asyncio import websockets async def hello(websocket): name = await websocket.recv() print(f"<<< {name}") greeting = f"Hello {name}!" await websocket.send(greeting) print(f">>> {greeting}") async def main(): async with websockets.serve(hello, "", port=8765): await asyncio.Future() # run forever if __name__ == "__main__": asyncio.run(main())
客户端(PC #2)代码
import asyncio import websockets async def hello(): uri = "ws://[2a02:8388:8bc7:4d00:1921:8126:966d:8d32]:8765" # 非真实IP async with websockets.connect(uri) as websocket: name = input("What's your name? ") await websocket.send(name) print(f">>> {name}") greeting = await websocket.recv() print(f"<<< {greeting}") if __name__ == "__main__": asyncio.run(hello())
排查与解决步骤
- 确认公网IP可用性:你使用的是IPv6地址,需先确认ISP分配的是全球可访问的IPv6单播地址(而非本地链路地址fe80::开头),部分ISP会通过NAT64转换IPv6流量,导致外部无法直接访问。若使用IPv4,家庭网络基本都是内网IP,必须配置端口映射。
- 配置端口映射(IPv4场景):在服务器所在网络的路由器上,添加端口映射规则,将外部8765端口的请求转发到服务器的内网IP(如192.168.x.x)和8765端口。
- 验证端口可达性:用外部设备通过
telnet 公网IP 8765或端口检测工具测试,确认8765端口能被外部访问,排除防火墙或ISP拦截的可能。 - IPv6网络配置检查:若使用IPv6,需确保路由器开启IPv6转发功能,同时服务器防火墙允许IPv6协议下8765端口的入站流量。
- 动态DNS适配(可选):若公网IP是动态分配的,建议绑定动态DNS域名,避免IP变化导致连接失败。
内容的提问来源于stack exchange,提问作者user6148356
相关产品推荐
相关产品推荐

