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

如何实现同一局域网内两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:45:47