Python socket开发C/S程序触发ConnectionRefusedError报错咨询
ConnectionRefusedError: [Errno 61] 排查解决指引
这个报错的核心原因是客户端发起TCP连接时,目标127.0.0.1:8080没有处于监听状态的服务进程,按以下优先级逐一排查即可:
- 检查启动顺序
必须先启动服务端,再启动客户端。先打开第一个终端执行命令:python 你的脚本文件名.py server
等终端打印出Start work!字样,说明服务端已经正常启动并开始监听端口,此时再打开第二个终端执行客户端启动命令:python 你的脚本文件名.py client - 检查服务端是否启动成功
如果执行服务端启动命令后没有打印Start work!,反而抛出Address already in use错误,说明8080端口已经被其他程序占用,服务端根本没跑起来。两种解决方式:- 把代码里
double_server和double_client的默认port参数从8080改成其他未被占用的端口(比如8090),两端端口保持一致即可 - 找到占用8080端口的进程关闭后,再重启服务端
- 把代码里
- 检查启动参数是否正确
服务端启动参数必须是小写的server,如果拼写错误(比如写成Server/serve),代码不会执行服务端启动逻辑,端口自然不会被监听。 - 验证端口监听状态
服务端启动后,可以执行系统命令确认8080端口处于监听状态:- macOS/Linux系统:执行
lsof -i :8080,输出里能看到对应python进程的状态为LISTEN即为正常 - Windows系统:执行
netstat -ano | findstr 8080,输出里状态为LISTENING即为正常
- macOS/Linux系统:执行
代码隐含问题修复
你当前的客户端代码在部分平台会出现连接成功后无输出的卡住问题,原因是行缓冲在socket文件对象上可能不生效,写入的数据滞留在缓冲区没有真正发给服务端。在f.write(f'{n}\n')后面加一行f.flush()即可解决:
def double_client(port=8080): with socket.create_connection(('127.0.0.1', port)) as s: f = s.makefile(mode='rw', buffering=1, newline='\n') while True: n = random.randrange(10) f.write(f'{n}\n') f.flush() # 新增这行,强制把缓冲区数据发送出去 print(n, f.readline().strip())
内容的提问来源于stack exchange,提问作者MONEY LONGER
相关产品推荐
相关产品推荐

