Flutter聊天应用连接Docker部署的RethinkDB时出现连接拒绝错误
Flutter应用连接Docker部署的RethinkDB失败:连接被拒绝
问题详情
将Flutter聊天应用连接Docker部署的RethinkDB服务器时,抛出异常:
Unhandled Exception: Could not connect to 127.0.0.1:28015. Error SocketException: Connection refused (OS Error: Connection refused, errno = 111)
已确认RethinkDB容器处于运行状态,将连接地址从127.0.0.1更换为本机IP后问题仍未解决。
相关代码
CompositionRoot.dart
import 'package:chat/chat.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_newapp/src/blocs/onBoarding/onboarding_cubit.dart'; import 'package:flutter_newapp/src/blocs/onBoarding/prfil_image_cubit.dart'; import 'package:flutter_newapp/src/data/Services/image_uploader.dart'; import 'package:flutter_newapp/src/data/Services/local_cache.dart'; import 'package:flutter_newapp/src/presentation/screen/onBoarding/onboarding.dart'; import 'package:rethink_db_ns/rethink_db_ns.dart'; import 'package:shared_preferences/shared_preferences.dart'; class CompositionRoot { static late SharedPreferences _sharedPreferences; static late RethinkDb _r; static late Connection _connection; static late IUserService _userService; static late ILocalCache _localCache; static late ImageUploader imageUploader; static configure() async { _r = RethinkDb(); _connection = await _r.connect(host: "127.0.0.1", port: 28015); _userService = UserService(_r, _connection); _localCache = LocalCache(_sharedPreferences); } static Widget composeOnboardingUi() { ImageUploader imageUploader = ImageUploader('http://localhost:3000/upload'); OnBoardingCubit onboardingCubit = OnBoardingCubit(_userService, _localCache, imageUploader); return MultiBlocProvider(providers:[ BlocProvider(create: (BuildContext context) => onboardingCubit ), BlocProvider(create: (BuildContext context) => ProfileImageCubit() ) ], child: OnBoardingScreen()); } }
main.dart
import 'package:flutter/material.dart'; import 'package:flutter_newapp/core/app_theme.dart'; import 'package:flutter_newapp/src/presentation/screen/onBoarding/onboarding.dart'; import 'composition_root.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await CompositionRoot.configure(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Chat App', debugShowCheckedModeBanner: false, theme: lightTheme(context), darkTheme: darkTheme(context), home: CompositionRoot.composeOnboardingUi(), ); } }
解决方案
1. 验证Docker端口映射
运行docker ps检查RethinkDB容器的端口映射,确认存在0.0.0.0:28015->28015/tcp的映射。如果没有,重新启动容器时添加端口映射参数:
docker run -p 28015:28015 rethinkdb
2. 修改RethinkDB绑定地址
默认RethinkDB仅绑定容器内的127.0.0.1,外部无法访问。启动容器时指定绑定所有地址:
docker run -p 28015:28015 rethinkdb rethinkdb --bind all
3. 调整Flutter连接地址
- 真机测试:使用主机的局域网IP(如
192.168.x.x),确保手机和主机在同一局域网。 - Android模拟器:用
10.0.2.2映射主机的127.0.0.1。 - iOS模拟器:可直接使用
localhost或主机IP。
修改CompositionRoot.dart中的连接代码:
_connection = await _r.connect(host: "你的目标地址", port: 28015);
4. 排查防火墙限制
确认主机防火墙未拦截28015端口:
- Linux:执行
sudo ufw allow 28015 - Windows:在防火墙高级设置中添加入站规则允许28015端口
内容的提问来源于stack exchange,提问作者FERHATI KHALIL
相关产品推荐
相关产品推荐

