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测试服务端本身是否能正常连接。
三、代码逻辑优化
你当前的代码存在两处可优化点,避免未捕获异常和逻辑冲突:
- 给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'); // 可自行添加连接失败提示、重试逻辑 } } - 你当前对同一个Socket实例调用了两次
listen方法,一次在main函数中,一次在MyApp的构造函数中,普通Stream只能被单次监听,你需要删掉其中一处listen逻辑,避免数据流冲突。
四、验证测试
完成以上配置后,你可以先将TCP服务端部署在宿主机,模拟器连接地址填10.0.2.2测试连通性,连通后再替换为局域网IP测试真实设备的连接效果。
内容的提问来源于stack exchange,提问作者Metehan Gezer
相关产品推荐
相关产品推荐

