Python SSL双向认证聊天程序客户端[Errno 111]连接拒绝求助
解决跨机连接被拒绝的排查步骤
确认服务器监听地址正确性
把服务器的bind参数明确改为0.0.0.0,而不是空字符串。虽然Python中空字符串等价于0.0.0.0,但部分环境下可能存在解析差异,直接指定0.0.0.0能确保服务器监听所有可用网卡的IP,而非仅本地回环。验证服务器实际监听状态
在服务器主机上执行以下命令,检查端口的监听情况:ss -tulpn | grep <你的端口号>确保输出结果中的监听地址是
0.0.0.0:<端口>,如果显示的是127.0.0.1:<端口>,说明服务器仅绑定了本地回环,跨机无法连接。排查网络连通性
- 用客户端ping服务器的局域网IP,确认两台设备在同一局域网且网络可达。如果ping不通,先检查路由器设置、设备IP段是否一致(比如均为
192.168.x.x段)。 - 若ping通但telnet被拒,检查服务器端是否有杀毒软件防火墙或路由器的端口过滤规则,部分杀毒软件会默认拦截陌生端口流量,路由器也可能限制了该端口的转发。
- 用客户端ping服务器的局域网IP,确认两台设备在同一局域网且网络可达。如果ping不通,先检查路由器设置、设备IP段是否一致(比如均为
检查端口占用与权限
- 用上述
ss命令确认目标端口未被其他进程占用。如果端口被占用,更换端口或终止占用进程。 - 若使用1-1024的特权端口,必须用
sudo运行服务器脚本,确保权限足够。
- 用上述
简化测试排除干扰
暂时移除SSL认证逻辑,编写最简版的TCP服务器和客户端:
服务器示例:import socket HOST = '0.0.0.0' PORT = 你的端口号 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() print(f"Listening on {HOST}:{PORT}") conn, addr = s.accept() with conn: print(f"Connected by {addr}") while True: data = conn.recv(1024) if not data: break conn.sendall(data)客户端示例:
import socket HOST = '服务器局域网IP' PORT = 你的端口号 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, server') data = s.recv(1024) print(f"Received {data!r}")测试基础TCP连接是否能通,若仍被拒,说明问题出在基础网络或服务器监听配置,而非SSL逻辑。
检查服务器代码逻辑
在服务器监听成功后添加打印日志,确认程序确实处于监听状态,避免因未捕获的异常导致socket意外关闭。比如在s.listen()后添加:print(f"Server is listening on {HOST}:{PORT} successfully")
内容的提问来源于stack exchange,提问作者enid
相关产品推荐
相关产品推荐

