You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:57:17