Flutter应用仅调试模式+特定IP可连MongoDB 其余场景报连接超时
问题描述
集成MongoDB的Flutter项目仅实现用户注册(SignUp)功能,目前仅在调试模式、测试设备连接个人手机热点时可正常运行。其余场景下点击注册按钮后会长时间等待,最终抛出如下错误:
SocketException: Connection timed out (OS Error: Connection timed out, errno = 110), address = 10.76.236.118, port = 44670
测试设备为三星Galaxy A50 (SM-A505F)安卓真机,可确认代码本身无逻辑错误:调试模式+设备连接对应手机热点(使用热点分配的特定IP)时,注册功能可完全正常运行。
相关截图




已提供配置信息
配置文件路径:./android/app/src/main/AndroidManifest.xml
配置内容如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.shopping"> <uses-permission android:name="android.permission.INTERNET"/> <application android:label="shopping" android:name="${applicationName}" android:icon="@mipmap/launcher_icon"> <activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <meta-data android:name="flutterEmbedding" android:value="2" /> </application> </manifest>
问题根因与解决方案
核心问题
你的AndroidManifest配置没有问题,已经声明了必要的互联网权限,故障根源是IP地址可达性问题,和调试/发布模式、MongoDB本身的基础配置无关:
- 你代码里写死的
10.76.236.118是运行MongoDB的电脑连接你手机热点时,热点DHCP分配的局域网私有IP,这类10段、192.168段、172.16-31段的私网IP仅在对应局域网内可被访问,一旦手机切换到其他WiFi、使用移动数据,就无法路由到这个私网地址,必然出现连接超时。 - 调试模式+连接个人热点时能正常运行,本质是此时手机和运行MongoDB的电脑处于同一个热点局域网内,手机可以正常访问到该私网IP对应的MongoDB服务。
修复方案
根据你的使用场景选对应方案即可:
- 本地局域网测试场景
每次切换局域网时,把代码中MongoDB连接地址的IP,替换为当前局域网下运行MongoDB的电脑对应的局域网IP,同时保证手机和电脑连接同一个WiFi/热点,且电脑系统防火墙放开MongoDB监听的44670端口入站规则即可连通。
若后续切换网络后仍出现连接超时,可在AndroidManifest.xml的<application>标签下补充android:usesCleartextTraffic="true"属性,放行Android 9+系统的明文HTTP流量限制。 - 跨网络/公网使用场景
强烈不建议Flutter客户端直连MongoDB,这种写法会把数据库账号密码、连接地址直接打包进APK安装包,极易被反编译泄露,导致数据库被拖库。正确做法是在服务端编写一层业务接口(可用Node.js/Flask/Go等任意技术栈实现),客户端仅请求公网部署的后端接口,由后端服务操作MongoDB完成注册逻辑。
如果只是临时公网测试,可选择两种方式:- 将MongoDB部署在带公网IP的云服务器上,配置好账号密码认证、防火墙端口放行规则,连接地址填写服务器公网IP
- 使用内网穿透工具将本地44670端口映射到公网,使用穿透工具生成的公网地址作为连接地址,务必开启MongoDB的账号认证,避免数据泄露。
内容的提问来源于stack exchange,提问作者Skyturkish
相关产品推荐
相关产品推荐

