Flutter应用Android端Socket.IO连接超时问题求助
Flutter WebSocket连接超时(手机端)排查方案
1. 先确认基础网络连通性
- 手机端打开浏览器,访问
http://192.168.203.48:3000,如果无法加载内容,说明网络层面有问题:- 检查PC和手机是否在同一Wi-Fi局域网,避免跨网段(比如PC连有线,手机连另一个Wi-Fi)。
- 关闭PC端防火墙/杀毒软件,或者手动放行3000端口的入站请求。
- 确认服务器监听地址是
0.0.0.0而非127.0.0.1,后者仅允许本地访问,局域网设备无法连接。
2. 检查Socket.IO版本与配置匹配
- 确保Flutter端
socket_io_client版本和服务器端Socket.IO版本兼容(比如服务器用v4.x,客户端对应v4.x的包,版本差异会导致握手失败)。 - 调整客户端连接配置:
socket = IO.io('http://192.168.203.48:3000', <String, dynamic>{ 'autoConnect': false, 'transports': ["polling", "websocket"], // 优先用polling建立连接再升级 'timeout': 10000, // 延长超时时间,适配手机网络延迟 'query': {'id': user_id} });
3. 针对移动端平台的特殊配置
- Android真机:无需额外配置,但必须使用PC的局域网IP(不能用
10.0.2.2,这个是模拟器专用)。 - iOS真机:需修改
Info.plist允许非HTTPS连接:
添加以下配置到Info.plist:
(或者更严格地指定服务器IP在<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>NSExceptionDomains中,避免全局放开) - 如果尝试443端口:必须改用
wss://协议头(WebSocket加密协议),且服务器需配置HTTPS证书,否则无法建立连接。
4. 服务器端跨域与监听配置
- 服务器端开启跨域支持,以Node.js为例:
const io = require('socket.io')(server, { cors: { origin: "*", // 允许所有来源,生产环境建议指定具体域名/包名 methods: ["GET", "POST"] } }); - 确认服务器端口未被其他程序占用,可通过
netstat -ano | findstr :3000(Windows)或lsof -i :3000(Mac/Linux)检查。
5. 调试定位问题
- 服务器端添加日志,查看是否收到手机端的连接请求:
如果无日志输出,说明网络未通;如果有日志但后续断开,说明协议或握手配置有问题。io.on('connection', (socket) => { console.log('新连接:', socket.handshake.query.id); }); - 用手机抓包工具(如Charles)分析请求,查看具体错误码(如403、500)或连接拒绝原因。
内容的提问来源于stack exchange,提问作者Error 404
相关产品推荐
相关产品推荐

