Kivy驾驶员疲劳检测App跨设备连接失败:ConnectionRefusedError求助
驾驶员疲劳检测App连接问题排查与解决
核心错误定位
ConnectionRefusedError: [errno 111] connection refused 明确说明Android客户端无法与PC服务器建立TCP连接,与摄像头采集环节无关(连接失败发生在数据传输前),重点排查网络连通性与服务器配置。
1. 修正服务器监听地址
服务器Socket绑定地址不能设为127.0.0.1(仅本地回环,手机无法访问),必须绑定到PC的局域网IP(如192.168.x.x)或0.0.0.0(监听所有网卡)。检查代码中的bind语句:
# 正确写法 server_socket.bind(('0.0.0.0', 80)) # 错误写法(仅本地可访问) # server_socket.bind(('127.0.0.1', 80))
2. 确认设备在同一局域网
手机与PC必须连接同一WiFi,确保处于同一子网。在PC上通过ipconfig(Windows)或ip addr(Linux/macOS)获取局域网IP,然后在手机浏览器访问http://[PC_IP]:80,若无法打开则说明网络连通存在问题。
3. 验证服务器端口监听状态
在PC上执行命令确认服务器是否正常监听80端口:
- Windows:
netstat -ano | findstr :80 - Linux/macOS:
ss -tulpn | grep :80
若未找到监听记录,说明服务器未正确启动Socket服务,检查是否有端口占用或代码异常。
4. 配置Android网络权限
在buildozer.spec中添加必要权限:
android.permissions = INTERNET, CAMERA
Android 10及以上必须明确声明INTERNET权限,否则App无法发起网络请求。
5. 更换非标准端口
80端口可能被系统或其他程序占用,尝试更换为8080、9999等非知名端口,同步修改服务器与客户端的端口配置。
6. 修正客户端连接逻辑
客户端连接地址必须填写PC的局域网IP,而非localhost或127.0.0.1(指向手机本地)。建议添加超时与异常处理:
import socket try: client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.settimeout(10) # 设置合理超时时间 client_socket.connect(('192.168.1.100', 80)) # 替换为PC的局域网IP except socket.timeout: print("连接超时,请检查网络") except ConnectionRefusedError: print("连接被拒绝,请确认服务器状态与端口配置")
7. 解决黑屏问题
黑屏大概率是摄像头权限未获取:
- 确认
buildozer.spec中已添加CAMERA权限 - Kivy调用摄像头时,尝试切换索引(0为后置,1为前置),确保使用正确的摄像头设备
额外测试建议
先编写简单的Socket echo程序验证网络连通:服务器接收字符串并原样返回,Android客户端发送测试数据,确认通信正常后再集成摄像头采集逻辑,逐步排查问题。
内容的提问来源于stack exchange,提问作者rayin
相关产品推荐
相关产品推荐

