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

Flutter连接TCP Socket(非WebSocket)及连接超时错误解决

Flutter TCP Socket连接超时问题解决方案

你遇到的Connection timed out错误本质是运行代码的模拟器无法成功建立到目标TCP服务端的连接,可按以下步骤逐一排查解决:

一、基础配置排查

  • 确认你代码中填写的服务端IP、端口和实际运行的TCP服务端监听地址完全一致,你当前错误日志里的连接地址是192.168.1.131,和代码里写的192.168.1.150不匹配,先确认是否填错了目标地址。
  • 安卓端需要在android/app/src/main/AndroidManifest.xml中添加网络权限,否则系统会直接拦截连接请求:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 如果你的安卓项目目标版本为API 28及以上,系统默认禁止明文非加密的TCP连接,需要在manifest的application标签中添加属性android:usesCleartextTraffic="true"放行普通TCP请求。

二、网络连通性排查

  • 首先确认TCP服务端正常运行,且监听的是0.0.0.0:2662而非127.0.0.1:2662,如果服务端仅监听回环地址,只有服务端所在设备自身能访问,模拟器、其他局域网设备都无法连接。
  • 安卓模拟器的网络和宿主机默认不在同一网段,安卓模拟器预留了特殊地址10.0.2.2指向宿主机,如果你要连接宿主机上运行的TCP服务端,先把连接地址改成10.0.2.2测试连通性。
  • 确认运行服务端的设备和模拟器/测试设备处于同一局域网,没有防火墙、端口隔离规则拦截2662端口的TCP请求,你可以先在宿主机上执行telnet 192.168.1.150 2662测试服务端本身是否能正常连接。

三、代码逻辑优化

你当前的代码存在两处可优化点,避免未捕获异常和逻辑冲突:

  1. 给Socket连接逻辑添加try-catch和超时时间,不要在main函数中直接await连接却不做错误处理:
    void main() async {
      try {
        // 添加5秒超时时间,避免长时间无响应
        Socket sock = await Socket.connect('10.0.2.2', 2662, timeout: const Duration(seconds: 5));
        print('Connected to: ${sock.remoteAddress.address}:${sock.remotePort}');
        runApp(MyApp(sock));
        // 剩余逻辑不变
      } catch(e) {
        print('连接失败: $e');
        // 可自行添加连接失败提示、重试逻辑
      }
    }
    
  2. 你当前对同一个Socket实例调用了两次listen方法,一次在main函数中,一次在MyApp的构造函数中,普通Stream只能被单次监听,你需要删掉其中一处listen逻辑,避免数据流冲突。

四、验证测试

完成以上配置后,你可以先将TCP服务端部署在宿主机,模拟器连接地址填10.0.2.2测试连通性,连通后再替换为局域网IP测试真实设备的连接效果。

内容的提问来源于stack exchange,提问作者Metehan Gezer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:36:04