Flutter点对点网络通信插件flutter_p2p_network的使用

Flutter点对点网络通信插件flutter_p2p_network的使用

flutter_p2p_network简介

flutter_p2p_network 是一个用于实现 Flutter 应用中点对点网络通信的插件。它允许设备之间直接进行数据传输,无需通过中心服务器。


使用步骤

1. 添加依赖

pubspec.yaml 文件中添加 flutter_p2p_network 依赖:

dependencies:
  flutter_p2p_network: ^0.0.1

然后运行以下命令以更新依赖:

flutter pub get

示例代码

以下是一个完整的示例代码,展示如何使用 flutter_p2p_network 插件实现点对点通信。

import 'dart:convert';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:io';

import 'package:flutter_p2p_network/flutter_p2p_network.dart';
import 'package:path_provider/path_provider.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  P2pNetWork p2p = P2pNetWork(); // 初始化 P2P 网络对象

  @override
  void initState() {
    super.initState();
  }

  /// 启动 P2P 网络
  Future<void> onStart() async {
    try {
      Directory dir = await getApplicationDocumentsDirectory(); // 获取应用目录
      String keyPath = dir.path;

      // 启动 P2P 网络并设置回调函数处理接收到的消息
      final peerState = await p2p.onStart(
          bootId: "12D3KooWAKzXfMEHicYoLWe2G3MuLJpcLAyjJmyiu4ZEZmd63sTB", // 引导节点 ID
          bootAddress: "/dns4/yangdong.co/tcp/25556", // 引导节点地址
          keyPath: keyPath, // 密钥存储路径
          onReceived: ({
            required String remotePeerId, // 远程节点 ID
            required int length, // 消息长度
            required int messageId, // 消息 ID
            required Uint8List data, // 消息数据
          }) {
            print("远程节点 ID: $remotePeerId");
            print("消息长度: $length");
            print("消息 ID: $messageId");
            print("接收到的消息: ${utf8.decode(data)}"); // 解码消息
          });

      // 打印本地节点信息
      print("==========================================>");
      print("本地节点 ID: ${peerState.id}");
      print("本地节点地址: ${peerState.address}");
      print("节点在线时间: ${peerState.uptime}");
      print("可达性: ${peerState.reachAbility}");
      print("==========================================>");
    } catch (e) {
      print("启动失败: $e");
    }
  }

  /// 发送消息
  Future<void> onRequest() async {
    try {
      List<String> peerIds = [
        "12D3KooWMCqtKcxmLmKjwkkRsCBtJxiH2r1N9HBHnb77zUdmZ7sm",
        "12D3KooWG88KDHPJwGwZzvyrjkAoTnJC46mtUS9xEaVf1MbsTiy8"
      ];
      List<int> data = utf8.encode("你好啊,你看到这条消息了吗?");
      await p2p.onRequest(
        peerId: peerIds[1], // 目标节点 ID
        messageId: 111, // 消息 ID
        data: Uint8List.fromList(data), // 消息数据
      );
      print("消息已发送!");
    } catch (e) {
      print("发送失败: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('P2P Network 示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              OutlinedButton(
                onPressed: () {
                  onStart(); // 启动 P2P 网络
                },
                child: const Text("启动 P2P 网络"),
              ),
              SizedBox(height: 20),
              OutlinedButton(
                onPressed: () {
                  onRequest(); // 发送消息
                },
                child: const Text("发送消息"),
              )
            ],
          ),
        ),
      ),
    );
  }
}

运行效果

运行上述代码后,点击按钮即可完成以下操作:

  1. 启动 P2P 网络

    • 点击“启动 P2P 网络”按钮后,插件会尝试启动 P2P 网络,并打印本地节点的详细信息。
    • 如果有其他设备也运行了相同的代码并启动了 P2P 网络,它们将自动连接并开始通信。
  2. 发送消息

    • 点击“发送消息”按钮后,指定的目标节点(peerIds[1])将接收到一条消息。
    • 接收方会打印出消息内容。

注意事项

  1. 引导节点

    • bootIdbootAddress 是引导节点的标识符和地址,确保这些值正确无误。
    • 如果没有可用的引导节点,可能无法成功建立 P2P 网络连接。
  2. 权限问题

    • 在 Android 上,需要添加网络权限:
      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
      

更多关于Flutter点对点网络通信插件flutter_p2p_network的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter点对点网络通信插件flutter_p2p_network的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_p2p_network 是一个用于在 Flutter 应用中实现点对点(P2P)网络通信的插件。它允许设备之间直接进行通信,而无需通过中央服务器。以下是如何使用 flutter_p2p_network 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 flutter_p2p_network 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_p2p_network: ^0.1.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化插件

在应用启动时,初始化 flutter_p2p_network 插件:

import 'package:flutter_p2p_network/flutter_p2p_network.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await FlutterP2pNetwork.initialize();
  runApp(MyApp());
}

3. 发现设备

使用 flutter_p2p_network 插件来发现附近的设备:

import 'package:flutter_p2p_network/flutter_p2p_network.dart';

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<DiscoveredDevice> _devices = [];

  @override
  void initState() {
    super.initState();
    _discoverDevices();
  }

  Future<void> _discoverDevices() async {
    try {
      List<DiscoveredDevice> devices = await FlutterP2pNetwork.discoverDevices();
      setState(() {
        _devices = devices;
      });
    } catch (e) {
      print('Error discovering devices: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('P2P Network Example'),
        ),
        body: ListView.builder(
          itemCount: _devices.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(_devices[index].name),
              subtitle: Text(_devices[index].address),
            );
          },
        ),
      ),
    );
  }
}

4. 连接到设备

选择一个设备并连接到它:

Future<void> _connectToDevice(DiscoveredDevice device) async {
  try {
    await FlutterP2pNetwork.connectToDevice(device.address);
    print('Connected to ${device.name}');
  } catch (e) {
    print('Error connecting to device: $e');
  }
}

5. 发送和接收数据

连接到设备后,可以发送和接收数据:

Future<void> _sendData(String message) async {
  try {
    await FlutterP2pNetwork.sendData(message);
    print('Data sent: $message');
  } catch (e) {
    print('Error sending data: $e');
  }
}

void _listenForData() {
  FlutterP2pNetwork.onDataReceived.listen((data) {
    print('Data received: $data');
  });
}

6. 断开连接

当不再需要连接时,可以断开连接:

Future<void> _disconnect() async {
  try {
    await FlutterP2pNetwork.disconnect();
    print('Disconnected');
  } catch (e) {
    print('Error disconnecting: $e');
  }
}
回到顶部