Flutter UDP通信插件udp的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter UDP通信插件udp的使用

udp 是一个轻量级的UDP库,适用于Dart语言。它能够帮助开发者在Flutter应用程序中轻松实现UDP协议的网络通信功能。

使用方法

简单用法示例

下面是一个简单的使用例子,展示了如何创建UDP实例、发送数据和接收数据:

import 'package:udp/udp.dart';

void main() async {
  // 创建一个UDP实例并绑定到第一个可用网络接口上的65000端口。
  var sender = await UDP.bind(Endpoint.any(port: Port(65000)));

  // 向广播地址上的65001端口发送一个简单的字符串。
  var dataLength = await sender.send(
      "Hello World!".codeUnits, Endpoint.broadcast(port: Port(65001)));

  print("$dataLength bytes sent.");

  // 创建一个新的UDP实例并绑定到本地地址和65002端口。
  var receiver = await UDP.bind(Endpoint.loopback(port: Port(65002)));

  // 接收\监听数据
  receiver.asStream(timeout: Duration(seconds: 20)).listen((datagram) {
    if (datagram != null) {
      var str = String.fromCharCodes(datagram.data);
      print(str);
    }
  });

  // 关闭UDP实例及其套接字。
  sender.close();
  receiver.close();

  // 多播(Multicast)示例
  var multicastEndpoint =
      Endpoint.multicast(InternetAddress("239.1.2.3"), port: Port(54321));

  var multicastReceiver = await UDP.bind(multicastEndpoint);

  var multicastSender = await UDP.bind(Endpoint.any());

  multicastReceiver.asStream().listen((datagram) {
    if (datagram != null) {
      var str = String.fromCharCodes(datagram?.data);
      print(str);
    }
  });

  await multicastSender.send("Foo".codeUnits, multicastEndpoint);

  await Future.delayed(Duration(seconds: 5));

  multicastSender.close();
  multicastReceiver.close();
}

特性与问题反馈

如果您有特性请求或发现bug,请在issue tracker上提交。

完整的示例Demo

以下是一个更完整的示例,包括了基本的UDP发送和接收,以及多播的使用。为了使代码结构更加清晰,我们将发送者和接收者的逻辑分离,并添加了异常处理以确保程序的健壮性。

发送者代码

import 'package:udp/udp.dart';
import 'dart:async';

Future<void> main() async {
  try {
    // 创建发送者
    var sender = await UDP.bind(Endpoint.any(port: Port(65000)));
    
    // 检查是否成功绑定
    if (!sender.isBound) {
      throw Exception('Failed to bind sender');
    }

    // 发送消息
    var dataLength = await sender.send(
        "Hello from Sender!".codeUnits, Endpoint.broadcast(port: Port(65001)));
    print("$dataLength bytes sent.");

    // 发送多播消息
    var multicastEndpoint =
        Endpoint.multicast(InternetAddress("239.1.2.3"), port: Port(54321));
    await sender.send("Multicast Message".codeUnits, multicastEndpoint);
    print("Multicast message sent.");

    // 关闭发送者
    sender.close();
  } catch (e) {
    print("Error occurred: $e");
  }
}

接收者代码

import 'package:udp/udp.dart';
import 'dart:async';

Future<void> main() async {
  try {
    // 创建接收者
    var receiver = await UDP.bind(Endpoint.loopback(port: Port(65002)));
    
    // 检查是否成功绑定
    if (!receiver.isBound) {
      throw Exception('Failed to bind receiver');
    }

    // 监听消息
    receiver.asStream(timeout: Duration(seconds: 20)).listen((datagram) {
      if (datagram != null) {
        var str = String.fromCharCodes(datagram.data);
        print("Received: $str");
      }
    }, onDone: () {
      print("Listening done.");
    }, onError: (error) {
      print("Error while listening: $error");
    });

    // 创建多播接收者
    var multicastEndpoint =
        Endpoint.multicast(InternetAddress("239.1.2.3"), port: Port(54321));
    var multicastReceiver = await UDP.bind(multicastEndpoint);

    // 监听多播消息
    multicastReceiver.asStream().listen((datagram) {
      if (datagram != null) {
        var str = String.fromCharCodes(datagram.data);
        print("Multicast Received: $str");
      }
    }, onDone: () {
      print("Multicast Listening done.");
    }, onError: (error) {
      print("Error while listening multicast: $error");
    });

    // 等待一段时间后关闭接收者
    await Future.delayed(Duration(seconds: 10));
    receiver.close();
    multicastReceiver.close();
  } catch (e) {
    print("Error occurred: $e");
  }
}

这个完整的示例演示了如何在Flutter应用中使用udp包进行UDP通信,包括普通消息发送接收和多播消息的发送接收。通过将发送者和接收者的逻辑分开,我们可以更好地理解每个部分的工作原理。同时,添加异常处理可以提高程序的稳定性和可靠性。


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

1 回复

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


在Flutter中实现UDP通信,可以使用udp插件。下面是一个基本的代码示例,展示了如何使用这个插件来发送和接收UDP数据包。

首先,确保在你的pubspec.yaml文件中添加了对udp插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  udp: ^x.y.z  # 替换为最新的版本号

然后,运行flutter pub get来安装插件。

接下来,你可以创建一个简单的Flutter应用,展示如何使用UDP插件。以下是一个完整的示例,包括发送和接收UDP数据包的代码。

import 'package:flutter/material.dart';
import 'package:udp/udp_dart.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter UDP Communication',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: UdpCommunicationScreen(),
    );
  }
}

class UdpCommunicationScreen extends StatefulWidget {
  @override
  _UdpCommunicationScreenState createState() => _UdpCommunicationScreenState();
}

class _UdpCommunicationScreenState extends State<UdpCommunicationScreen> {
  UdpSocket? _udpSocket;
  TextEditingController _messageController = TextEditingController();
  String _receivedData = "";

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

  void initUdpSocket() async {
    try {
      _udpSocket = await UdpSocket.bind(InternetAddress.anyIPv4, 0);
      _udpSocket!.listen((datagram) {
        String receivedData = String.fromCharCodes(datagram.data);
        setState(() {
          _receivedData = receivedData;
        });
      });
      print("UDP socket initialized on port ${_udpSocket!.localPort}");
    } catch (e) {
      print("Failed to initialize UDP socket: $e");
    }
  }

  void sendMessage() async {
    String message = _messageController.text;
    List<int> data = message.codeUnits;
    DatagramPacket packet = DatagramPacket(data, InternetAddress.loopbackIPv4, 12345);
    try {
      await _udpSocket!.send(packet);
      print("Message sent: $message");
    } catch (e) {
      print("Failed to send message: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter UDP Communication'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _messageController,
              decoration: InputDecoration(
                labelText: 'Message',
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: sendMessage,
              child: Text('Send Message'),
            ),
            SizedBox(height: 16),
            Text('Received Data:'),
            Text(_receivedData),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    _udpSocket?.close();
    _messageController.dispose();
    super.dispose();
  }
}

代码说明

  1. 依赖管理:在pubspec.yaml中添加udp插件依赖。

  2. UDP Socket 初始化:在initUdpSocket方法中,创建一个UDP套接字并绑定到任意IPv4地址和随机端口。然后监听接收到的数据包,并将接收到的数据更新到状态中。

  3. 发送消息:在sendMessage方法中,将用户输入的消息编码为字节数组,并通过UDP套接字发送到指定的地址和端口(在这个示例中,使用回环地址127.0.0.1和端口12345)。

  4. UI构建:使用Flutter的Material组件构建一个简单的用户界面,包括一个文本输入框、一个发送按钮和一个显示接收到的数据的文本区域。

  5. 资源清理:在dispose方法中,关闭UDP套接字并释放文本控制器资源。

这个示例展示了如何在Flutter应用中使用udp插件进行基本的UDP通信。请确保在实际应用中根据需要进行适当的错误处理和资源管理。

回到顶部