求助:使用Python Socket跨网络连接两台电脑时遇超时及路由不可达错误
解决跨网络Socket连接的Timeout和No Route错误
我来帮你一步步排查并解决这两个连接错误,你的代码和网络配置里有几个关键问题需要调整:
1. 代码层面的核心问题
服务器绑定地址错误
你的server.py里绑定了"127.0.0.1"——这个是本地回环地址,只能让同一台机器上的程序访问,其他网络的电脑根本找不到这个Socket服务。你需要改成绑定服务器的公网IP,或者更通用的"0.0.0.0"(表示监听服务器上所有可用的网络接口)。
端口不匹配
服务器端绑定的是80端口,但客户端连接的是8820端口,两边端口完全不一致,这肯定连不上。另外80是HTTP的默认端口,通常需要管理员权限才能使用,建议改用1024以上的非知名端口(比如统一用8820)。
修改后的代码示例
修正后的server.py
import socket server_socket = socket.socket() # 绑定所有网络接口,端口统一为8820 server_socket.bind(("0.0.0.0", 8820)) server_socket.listen(1) (client_socket, client_address) = server_socket.accept() print(f"client_connected [{client_address[0]}]") client_command = client_socket.recv(1024).decode() print(f"Received command: {client_command}") # 给客户端发送一个回复,避免客户端recv阻塞报错 client_socket.send("Command received successfully".encode()) # 关闭连接 client_socket.close() server_socket.close()
修正后的client.py
import socket client_socket = socket.socket() # 替换成服务器的真实公网IP,端口和服务器保持一致 client_socket.connect(("your_server_public_ip", 8820)) client_command = input("command: ") client_socket.send(client_command.encode()) data = client_socket.recv(1024).decode() print("server: " + data) client_socket.close()
2. 网络层面的必要配置
代码改对了还不够,跨网络连接还需要解决网络通路的问题:
- 开放服务器防火墙端口:不管是服务器系统自带的防火墙(比如Linux的
ufw allow 8820/iptables,Windows Defender防火墙的入站规则),还是云服务商的安全组(如果是云服务器),都必须允许外部访问8820端口。 - 端口转发(针对局域网内的服务器):如果你的服务器是在家庭/公司局域网里,没有直接的公网IP,那需要登录路由器设置端口转发——把路由器的8820端口转发到服务器的内网IP(比如192.168.1.100)和8820端口。
- 确认公网IP正确性:在服务器上执行
curl ifconfig.me(Linux)或者访问IP查询网站(Windows),获取真实的公网IP,客户端必须用这个IP才能连接。
错误原因解释
TimeoutError: [Errno 110] Connection timed out:通常是因为服务器没有监听正确的地址/端口,或者防火墙拦截了连接请求,客户端无法建立连接。OSError: [Errno 113] No route to host:一般是客户端无法找到到达服务器的网络路径,可能是IP填写错误、服务器所在网络没有做端口转发,或者路由配置有问题。
内容的提问来源于stack exchange,提问作者asaf
相关产品推荐
相关产品推荐

