如何实现同一局域网内两个Flutter应用间的本地数据传输?
同一局域网下Flutter应用间通信实现方案
针对同一局域网内两个Flutter应用的通信需求,以下是几种实用的实现方案,涵盖跨设备与同一设备场景:
1. TCP/UDP Socket通信(跨设备首选)
通过原生Socket建立直接连接,一个应用作为服务端监听端口,另一个作为客户端发起连接并传输数据,是最轻量直接的跨设备通信方式。
服务端(接收数据的应用)
使用Dart内置的dart:io库实现:
import 'dart:io'; void startServer() async { // 监听所有网卡的8080端口,可自定义端口 final server = await ServerSocket.bind(InternetAddress.anyIPv4, 8080); print('服务端启动,监听地址: ${server.address}:${server.port}'); // 处理客户端连接 await for (final socket in server) { print('客户端已连接: ${socket.remoteAddress}:${socket.remotePort}'); // 监听客户端发送的数据 socket.listen( (data) { final message = String.fromCharCodes(data); print('收到数据: $message'); // 可选:回复客户端 socket.write('已接收消息: $message'); }, onDone: () => print('客户端断开连接'), onError: (error) => print('连接出错: $error'), ); } }
客户端(发送数据的应用)
import 'dart:io'; void sendData(String serverIp, int port, String message) async { try { // 连接服务端的局域网IP和端口 final socket = await Socket.connect(serverIp, port); print('已连接到服务端: ${socket.remoteAddress}:${socket.remotePort}'); // 发送数据 socket.write(message); // 监听服务端回复 socket.listen( (data) => print('服务端回复: ${String.fromCharCodes(data)}'), onDone: () => print('与服务端断开连接'), onError: (error) => print('连接出错: $error'), ); } catch (e) { print('连接失败: $e'); } }
关键注意点
- 服务端需获取自身局域网IP(如
192.168.x.x),可通过以下代码获取:
Future<String> getLocalIp() async { for (final interface in await NetworkInterface.list()) { for (final addr in interface.addresses) { if (addr.type == InternetAddressType.IPv4 && !addr.isLoopback) { return addr.address; } } } return '127.0.0.1'; }
- 确保两台设备在同一局域网,且目标端口未被占用、防火墙允许该端口通信。
2. MQTT协议通信(多设备场景适配)
MQTT是轻量级消息队列协议,适合多设备、多消息的局域网通信场景,需先在局域网内搭建MQTT Broker(如Eclipse Mosquitto)。
发布端(发送数据的应用)
使用mqtt_client第三方库实现:
import 'package:mqtt_client/mqtt_client.dart'; import 'package:mqtt_client/mqtt_server_client.dart'; Future<void> publishMessage(String brokerIp, int port) async { final client = MqttServerClient(brokerIp, 'flutter_publisher'); client.port = port; client.logging(on: false); try { await client.connect(); if (client.connectionStatus!.state == MqttConnectionState.connected) { print('已连接到MQTT Broker'); // 发布消息到指定主题 final payloadBuilder = MqttClientPayloadBuilder(); payloadBuilder.addString('来自Flutter应用的消息'); client.publishMessage('flutter/device/msg', MqttQos.atLeastOnce, payloadBuilder.payload!); print('消息已发布'); } } catch (e) { print('连接失败: $e'); client.disconnect(); } }
订阅端(接收数据的应用)
import 'package:mqtt_client/mqtt_client.dart'; import 'package:mqtt_client/mqtt_server_client.dart'; Future<void> subscribeTopic(String brokerIp, int port) async { final client = MqttServerClient(brokerIp, 'flutter_subscriber'); client.port = port; client.logging(on: false); // 监听收到的消息 client.onMessageReceived = (MqttPublishMessage message, _) { final payload = MqttPublishPayload.bytesToStringAsString(message.payload.message); print('收到消息: $payload,来自主题: ${message.variableHeader!.topicName}'); }; try { await client.connect(); if (client.connectionStatus!.state == MqttConnectionState.connected) { print('已连接到MQTT Broker'); // 订阅指定主题 client.subscribe('flutter/device/msg', MqttQos.atLeastOnce); } } catch (e) { print('连接失败: $e'); client.disconnect(); } }
关键注意点
- 搭建Mosquitto Broker时,需修改配置文件允许局域网连接:设置
listener 1883 0.0.0.0,并开启匿名访问(注释allow_anonymous false)或配置用户名密码。 - 两个应用需知晓Broker的局域网IP和默认端口1883。
3. 本地广播(仅同一设备内通信)
若两个应用运行在同一台设备上,可通过平台原生广播机制实现通信,需借助第三方库封装Android的Intent和iOS的NSNotification。
发送端
import 'package:flutter_broadcast/flutter_broadcast.dart'; void sendLocalBroadcast() { FlutterBroadcast.sendBroadcast( action: 'com.your.app.COMMUNICATION_ACTION', data: {'content': '来自另一应用的本地数据'}, ); }
接收端
import 'package:flutter_broadcast/flutter_broadcast.dart'; void listenLocalBroadcast() { FlutterBroadcast.registerBroadcast( action: 'com.your.app.COMMUNICATION_ACTION', onReceive: (data) { print('收到本地广播数据: ${data['content']}'); }, ); }
关键注意点
- 该方案仅适用于同一设备内的应用通信,跨设备场景无效;iOS端需额外配置通知权限。
方案选择建议
- 跨设备通信:优先选Socket通信(轻量直接),多设备/多消息场景选MQTT协议。
- 同一设备通信:使用本地广播方案。
内容的提问来源于stack exchange,提问作者Giannis Petsis
相关产品推荐
相关产品推荐

