Python Socket客户端连接服务端被拒绝问题求助
Socket连接被拒绝问题排查及修复
核心问题说明
连接被拒绝主要由服务端代码逻辑错误、主机名解析异常、启动顺序错误三类原因导致,具体排查点和修复方案如下:
1 错误点整理
- 服务端变量名调用错误:服务端中
server_data = client.recv(4096)、client_close()两行存在核心错误,client是客户端代码的变量名,服务端接收连接后返回的连接对象是conn,没有全局的client变量和client_close()函数,需要改为调用conn的对应方法。 - 重复读取逻辑错误:客户端仅发送了一次数据,服务端已经通过
conn.recv(4096)读取过数据,二次调用recv会导致进程阻塞。 - 主机名解析潜在风险:
socket.gethostname()返回的主机名可能解析到非本地环回地址,客户端和服务端解析结果不一致时就会出现连接拒绝,本地测试建议统一使用127.0.0.1。 - 启动顺序错误:必须先启动服务端监听端口,再启动客户端发起连接,否则客户端会直接报连接拒绝。
2 修正后代码
客户端代码 socket_client.py
import socket # 本地测试使用环回地址,避免解析错误 host = '127.0.0.1' port = 8080 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((host, port)) client.send(b' testing data send...') client.close()
服务端代码 socket_server.py
import socket host = '127.0.0.1' port = 8080 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen(10) x = 0 server_data = [] while True: conn, addr = server.accept() data = conn.recv(4096).decode() x += 1 print(f'服务第{x}个客户端,客户端地址:{addr[0]},接收数据:{data}') # 处理完成后关闭当前连接 conn.close() server.close()
3 额外注意事项
- 启动前确认8080端口未被其他进程占用:Windows可执行
netstat -ano | findstr 8080,Linux/macOS可执行lsof -i:8080检查端口占用情况。 - 若需要跨设备访问,服务端需要绑定
0.0.0.0,客户端连接时填写服务端所在设备的局域网IP。
内容的提问来源于stack exchange,提问作者Kaya Pina
相关产品推荐
相关产品推荐

