跨双Wi-Fi网络的Python Socket编程求助:服务器与客户端分属不同IP
跨网络Python Socket通信实现方案
核心逻辑
服务器与客户端分属不同私网,无法直接通过私网IP通信,需借助公网IP+端口映射或内网穿透工具绕过NAT限制。
方案一:端口映射(适用于服务器侧有公网IP场景)
- 确认公网IP:在Server(笔记本)上执行
curl ifconfig.me获取router1的公网IP - 配置端口映射:登录router1的管理后台,添加映射规则:
- 外部端口:选一个未被占用的端口(如
12345) - 内部地址:Server的私网IP(如
192.168.1.100) - 内部端口:Socket服务监听的端口(如
8000)
- 外部端口:选一个未被占用的端口(如
- 客户端代码修改:将连接目标改为公网IP+外部端口,示例:
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 替换为你的公网IP和映射的外部端口 client.connect(("123.45.67.89", 12345)) client.send(b"Hello from Raspberry Pi") data = client.recv(1024) print(f"Received: {data.decode()}") client.close() - 服务器端代码:保持监听私网IP对应端口即可,示例:
import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 监听所有网卡的8000端口 server.bind(("0.0.0.0", 8000)) server.listen(5) print("Server listening...") conn, addr = server.accept() print(f"Connected by {addr}") data = conn.recv(1024) print(f"Received: {data.decode()}") conn.send(b"Hello from Server") conn.close()
方案二:内网穿透(适用于服务器侧无公网IP场景)
如果router1没有公网IP,用内网穿透工具绕过NAT,以frp为例:
- 准备一台带公网IP的VPS作为frp服务端:
- 安装frps,配置
frps.ini:[common] bind_port = 7000 # frp服务端监听端口 - 启动frps:
./frps -c ./frps.ini
- 安装frps,配置
- 在Server(笔记本)上配置frpc客户端:
- 安装frpc,配置
frpc.ini:[common] server_addr = 你的VPS公网IP server_port = 7000 [tcp_socket] type = tcp local_ip = 127.0.0.1 local_port = 8000 # Socket服务监听端口 remote_port = 12345 # VPS上的映射端口 - 启动frpc:
./frpc -c ./frpc.ini
- 安装frpc,配置
- 客户端(树莓派)连接VPS的
[公网IP]:12345即可通信,代码同方案一客户端代码。
注意事项
- 确保Server本地防火墙允许监听端口(如8000)通过,router1防火墙允许映射的外部端口(如12345)通过
- 使用frp时,VPS防火墙需开放frps的bind_port和remote_port
- 可先用
telnet [公网IP] [外部端口]验证端口是否可达
内容的提问来源于stack exchange,提问作者suma latha
相关产品推荐
相关产品推荐

