使用Python通过Socket连接Google Cloud服务器时公网IP无法连接如何解决
公网可访问的Socket通信配置方案
核心问题原因
你当前代码服务端绑定的127.0.0.1是本地回环地址,仅允许同一台机器上的进程发起连接,外部设备(包括同一局域网其他设备、公网设备)都无法访问这个监听端口。
分步修改配置
- 第一步:修改服务端监听地址
将服务端代码中的HOST参数改为0.0.0.0,即可监听服务器所有可用的网络接口,无论是本地请求还是公网传入的请求都能被接收。
修改后的服务端代码如下:import socket HOST = '0.0.0.0' # 监听所有网络接口 PORT = 65432 # 监听端口(非特权端口需大于1023) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() conn, addr = s.accept() with conn: print('Connected by', addr) while True: data = conn.recv(1024) if not data: break # 此处替换为你自己的运算逻辑,返回处理后的GPS坐标即可 conn.sendall(data) - 第二步:放行服务端端口访问权限
你需要在两处开放65432端口的TCP访问权限:- 云服务器控制台的防火墙规则:添加入站规则,允许TCP协议的65432端口,测试阶段可将来源IP设为
0.0.0.0/0,正式使用时再缩小到你客户端的公网IP段提升安全性 - 服务器系统内部的防火墙:如果你的服务器系统开启了ufw/firewalld等防火墙,执行对应命令放行端口,比如ufw的操作命令为
ufw allow 65432/tcp
- 云服务器控制台的防火墙规则:添加入站规则,允许TCP协议的65432端口,测试阶段可将来源IP设为
- 第三步:修改客户端连接地址
将客户端代码中的HOST参数替换为你的Google Cloud服务器的公网IP即可,修改后的参考代码如下:import socket HOST = '替换为你的云服务器公网IP' # 云服务器的公网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('Received', repr(data))
额外注意事项
- 测试连通性时可以先在客户端设备上执行
nc -zv 你的公网IP 65432,如果返回连接成功再运行代码,能快速定位是网络问题还是代码问题 - 如果需要长期使用,建议在云服务器控制台给实例绑定静态公网IP,避免实例重启后公网IP变化需要反复修改客户端代码
内容的提问来源于stack exchange,提问作者Michael Hüppe
相关产品推荐
相关产品推荐

