【Flutter】udp通信

本片适合初学者阅读,老登可以划过啦

UDP(User Datagram Protocol)

UDP中文翻译用户数据报协议,是一个无连接协议,这意味着在发送数据之前不需要建立连接。每个数据包(称为数据报)都是独立的,发送方和接收方之间没有持久的连接

UDP 和 TCP 的主要区别

特性 UDP TCP
连接方式 无连接(Connectionless) 面向连接(Connection-Oriented)
可靠性 不可靠(不保证数据包的到达、顺序、完整性) 可靠(通过重传机制保证数据可靠传输)
数据顺序 不保证数据包的顺序 保证数据按顺序到达
流量控制 不提供流量控制 提供流量控制(控制发送速率,防止拥塞)
头部开销 较小(8 字节) 较大(20 字节)
适用场景 实时应用(如视频、音频、在线游戏等) 需要保证数据完整性和顺序的应用(如网页、文件传输等)
速度 较快(低延迟,低开销) 较慢(需要建立连接、确认、重传等)

Dart中如何使用UDP

Dart中使用udp非常简单,无需第三方插件即可完成简单工作。

创建服务,启动监听

  RawDatagramSocket? _udp;

  initUdp() async{
   try {
     /// 初始化 先创建自己的服务
     /// 遇到一笑话,主要是一直也没仔细研究过UDP的协议和原理,所以开始一度认为他和webscoket的连接方式是一样的,
     /// 首先绑定对方地址,成功后进行监听和信息发送操作,开始绑定就是失败的,一度怀疑服务器出了问题,
     /// 后来用了一个udp的工具可以创建服务端和客户端收,依然还是不行最后学了一遍才恍然大悟,原来udp和tcp不是一个玩意......
     _udp = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 5556);
     /// 对创建的服务进行监听,监听的RawSocketEvent事件: 读和写,写操作就是我发送的消息,读操作就是接收的消息
     _udp?.listen((event) {
        if (event == RawSocketEvent.read) {
          final datagram = _udp!.receive();
          if (datagram != null) {
            final message = utf8.decode(datagram.data);
            debugPrint(message);
          }
        }
      });
     
      } catch (e) {
      debugPrint(e)
    }
  }

发送消息

/// 发送消息的时候会发生两种情况
/// 第一个是buffer没什么好说的了;第二个是网络地址,也就是IP地址,但是我们一般情况下都是用域名连接,
/// 所以这个地方需要用到lookup查找主机地址的方法;第三个是端口号
_udp?.send(List<int> buffer, InternetAddress address, int port)

 var addresses = await InternetAddress.lookup("www.baidu.com");
_udp?.send(Uint8List.fromList("测试数据".codeUnits), addresses.first, port);

工具,用起来还是满方便的,有助于快速定位问题所在不用去和其他人沟通

【Flutter】udp通信_第1张图片

注意:在开发过程中,假如使用了上面的图,并且是通过真机进行测试的话,一定要注意ip地址,我最开的时候一直在用127.0.0.1:9093,发送也能抓取到监听,但是就是服务端收不到消息,然后就发呆离线了好久…,这个问题一定要注意,不同设备是要通过内网的ip地址,而不是本地地址进行互通,一定一定别犯二

通过百度网盘分享的文件:tcpudp2.1.1.exe
链接:https://pan.baidu.com/s/1Vq15THAFwh_UjvTn3zzZpQ
提取码:g11x

你可能感兴趣的:(Flutter,flutter,udp,手机,android,ios)