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

基于Flutter&Dart的同机/局域网跨应用通信方案咨询

最优实现方案

一、同一PC进程间通信(基础需求)

1. Unix域套接字(Linux/macOS)+ 命名管道(Windows)

  • 这是本地进程通信的轻量首选方案,无需依赖网络栈,性能拉满,完全符合无互联网、无数据库的要求。
  • Dart的dart:io库原生支持:
    • Linux/macOS端用Socket.bind创建Unix域套接字,路径设为本地文件(比如/tmp/background_service.sock);
    • Windows端用NamedPipeServerStream和NamedPipeClientStream实现双向通信。
  • 数据序列化直接用Dart原生的jsonEncode/jsonDecode,能轻松处理Map、字符串、整数这类类型;如果数据结构复杂或追求性能,也可以用protobuf序列化。

2. Dart Isolate(仅限后台服务无需独立进程的场景)

  • 要是后台服务不需要单独成一个独立应用,只是ForegroundApp里的无UI后台任务,直接用Isolate最省事:通过SendPort和ReceivePort传递消息,Dart原生类型(包括Map、字符串、整数)直接就能传,连序列化都省了。
  • 但如果必须是两个独立的应用进程,这个方案就不适用了。

二、局域网跨PC通信+多连接支持(可选需求)

TCP Socket通信

  • 用Dartdart:io库直接搭TCP服务端和客户端:
    • 后台服务(BackgroundApp)调用ServerSocket.bind绑定局域网IP(或0.0.0.0监听所有接口)和指定端口,就能自动接受多客户端连接;
    • 前台应用(ForegroundApp)通过Socket.connect传入后台服务的局域网IP和端口即可建立连接。
  • 数据处理和本地通信一致,用jsonEncode/jsonDecode或protobuf做序列化,保证跨设备数据能正常解析。
  • 多连接管理:后台维护一个已连接客户端的Socket列表,每个客户端的消息单独处理,避免互相阻塞。

三、方案选型建议

  • 本地进程通信优先选Unix域套接字/命名管道,比HTTP轻量太多,不用启动HTTP服务,资源占用极低;
  • 跨局域网场景必须用TCP Socket,HTTP是基于TCP的应用层协议,直接用TCP更灵活、性能更高,还省了HTTP框架的额外开销;
  • 序列化优先用jsonEncode/jsonDecode(原生支持,不用加额外依赖),数据量大或追求极致性能再考虑protobuf(需要定义.proto文件,加对应依赖)。

简单代码示例

后台服务(TCP服务端,支持多连接)

import 'dart:io';
import 'dart:convert';

void main() async {
  final server = await ServerSocket.bind(InternetAddress.anyIPv4, 8080);
  print('后台服务启动,监听端口8080');

  await for (Socket client in server) {
    print('新客户端连接: ${client.remoteAddress}');
    handleClient(client);
  }
}

void handleClient(Socket client) {
  client.transform(utf8.decoder).listen((data) {
    final message = jsonDecode(data);
    print('收到消息: $message');

    // 回复示例
    client.write(jsonEncode({'status': 'success', 'data': '已收到你的消息'}));
  }, onDone: () {
    print('客户端断开连接');
    client.close();
  }, onError: (error) {
    print('客户端连接出错: $error');
    client.close();
  });
}

前台客户端(TCP客户端)

import 'dart:io';
import 'dart:convert';

void main() async {
  try {
    final socket = await Socket.connect('192.168.1.100', 8080); // 替换为后台服务的局域网IP
    print('连接成功');

    // 发送Map类型数据
    final message = {'type': 'greeting', 'content': '你好后台服务', 'count': 100};
    socket.write(jsonEncode(message));

    // 接收回复
    socket.transform(utf8.decoder).listen((data) {
      final response = jsonDecode(data);
      print('收到回复: $response');
    });
  } catch (e) {
    print('连接失败: $e');
  }
}

内容的提问来源于stack exchange,提问作者jas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:32:02