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("发送消息"),
)
],
),
),
),
);
}
}
运行效果
运行上述代码后,点击按钮即可完成以下操作:
-
启动 P2P 网络:
- 点击“启动 P2P 网络”按钮后,插件会尝试启动 P2P 网络,并打印本地节点的详细信息。
- 如果有其他设备也运行了相同的代码并启动了 P2P 网络,它们将自动连接并开始通信。
-
发送消息:
- 点击“发送消息”按钮后,指定的目标节点(
peerIds[1]
)将接收到一条消息。 - 接收方会打印出消息内容。
- 点击“发送消息”按钮后,指定的目标节点(
注意事项
-
引导节点:
bootId
和bootAddress
是引导节点的标识符和地址,确保这些值正确无误。- 如果没有可用的引导节点,可能无法成功建立 P2P 网络连接。
-
权限问题:
- 在 Android 上,需要添加网络权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- 在 Android 上,需要添加网络权限:
更多关于Flutter点对点网络通信插件flutter_p2p_network的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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');
}
}