Flutter安卓真机连接Linux服务器报错:SocketException无路由到主机
Flutter真机连接Linux服务器报错No route to host的解决方案
针对你遇到的「模拟器能正常连接Linux服务器,但多数真机报错SocketException: No route to host (OS Error: No route to host, errno = 113)」的问题,按以下步骤排查解决:
1. 确认网络连通性基础
- 确保真机和Linux服务器处于同一局域网:模拟器默认共享电脑网络,所以能连,但真机如果用手机流量、不同WiFi或者挂了VPN,肯定无法访问内网服务器。先关掉VPN、切换到服务器所在的WiFi网络。
- 在真机上测试ping服务器IP:装个终端类APP(比如Termux),执行
ping 10.2.19.104,如果ping不通,直接锁定是网络层面问题,和代码无关。
2. 检查Linux服务器防火墙配置
服务器防火墙大概率拦截了3000端口的入站请求:
- 若用ufw防火墙:
sudo ufw allow 3000/tcp sudo ufw reload - 若用firewalld防火墙:
sudo firewall-cmd --add-port=3000/tcp --permanent sudo firewall-cmd --reload - 也可以临时关闭防火墙测试:
sudo ufw disable(ufw)或sudo systemctl stop firewalld(firewalld),如果能连了,再重新配置规则。
3. 验证服务器服务的监听地址
确保服务器上的服务是监听0.0.0.0(允许所有IP访问),而不是仅监听127.0.0.1(仅本地访问):
- 执行命令查看监听状态:
ss -tulpn | grep 3000 - 输出如果是
0.0.0.0:3000或:::3000,说明监听正常;如果是127.0.0.1:3000,需要修改服务的配置文件,把监听地址改成0.0.0.0。
4. 排查真机的系统限制
- 确认AndroidManifest.xml已添加必要权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 关闭安卓10+设备的私有DNS:进入「设置-网络与互联网-私有DNS」,选择「关闭」。
- 检查品牌手机的安全限制:小米、华为等厂商的安全中心可能会拦截应用的局域网访问,找到对应应用的网络权限设置,确保允许访问WiFi和局域网。
5. 代码优化(非当前问题核心,但建议调整)
你的代码里硬编码了3000端口,传入的port参数未被使用,建议修正避免后续混淆:
Socket? _socket; Stream? stream; Future<void> connect({ required String ip, required int port, }) async { try { // 改用传入的port参数,增加超时设置 _socket = await Socket.connect(ip, port, timeout: const Duration(seconds: 5)); stream = _socket!.asBroadcastStream(); } on Exception catch(e){ print("Error: $e"); } print(ip); print(port); }
内容的提问来源于stack exchange,提问作者Derek Hacault
相关产品推荐
相关产品推荐

