Python Socket跨网连接问题:服务器正常,客户端启动即关闭
Python Socket跨网络连接故障排查
服务器端运行无异常,但外部客户端启动后直接关闭。
客户端代码
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((MY PUBLIC IP, 1234)) while True: full_msg = '' while True: msg = s.recv(8) if len(msg) <= 0: break full_msg += msg.decode("utf-8") if len(full_msg) > 0: print(full_msg)
服务器端代码
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('127.0.0.1', 1234)) s.listen(5) while True: clientsocket, address = s.accept() print(f"Connection from {address} has been established.") clientsocket.send(bytes("OI PEDRONE","utf-8")) clientsocket.close()
已尝试的操作
- 将服务器绑定IP修改为
0.0.0.0或socket.gethostname(),问题仍未解决。
解决办法
1. 配置路由器端口映射
服务器处于局域网内,外部客户端通过公网IP无法直接访问,必须在路由器上设置端口转发:
- 登录路由器管理后台(通常地址为
192.168.1.1或192.168.0.1) - 找到「端口转发」/「虚拟服务器」选项
- 添加规则:外部端口
1234,内部端口1234,内部IP填服务器在局域网内的真实IP(如192.168.3.10),协议选择TCP
2. 给客户端添加异常捕获
客户端直接关闭是因为连接失败或后续操作抛出异常但无处理逻辑,修改代码捕获异常并保留窗口:
import socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("你的公网IP", 1234)) full_msg = '' while True: msg = s.recv(8) if len(msg) <= 0: break full_msg += msg.decode("utf-8") if full_msg: print(full_msg) except Exception as e: print(f"错误信息: {e}") input("按回车退出...")
3. 调整服务器连接逻辑
服务器发送消息后立刻关闭连接,客户端接收完数据后会再次尝试recv,此时连接已断开会触发异常。可以让服务器延迟关闭,或客户端接收完主动退出:
- 服务器端修改(添加延迟):
import socket import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('0.0.0.0', 1234)) s.listen(5) while True: clientsocket, address = s.accept() print(f"Connection from {address} has been established.") clientsocket.send(bytes("OI PEDRONE","utf-8")) time.sleep(1) # 延迟1秒再关闭,确保客户端接收完成 clientsocket.close()
4. 检查防火墙设置
- 服务器本地防火墙:允许
1234端口的TCP入站连接 - 客户端网络防火墙:允许访问目标公网IP的
1234端口
内容的提问来源于stack exchange,提问作者yut
相关产品推荐
相关产品推荐

