Netty(4)之UDP协议开发

Netty(4)之UDP协议开发UDP 协议开发 1 概述 UDP 用户数据协议 UserDatagram 2 作用将网络流量压缩成数据报形式 提供面向事务的简单信息传输服务 利用 IP 协议进行数据报传输 提供无连接的 不可靠的数据投递服务 3 特点资源消耗小 处理速度快 通常使用在视频 音频等可靠性要求不高的数据传输 UDP 是无连接的 发送方和接收方相互交换信息使双方同步 UDP 接受到后不发送确认信息 发送端不知道是否成功 也不会重发 UDP 传送数据比 TCP 快 系统开销小 常用于视频 图片以及简单文件传输系

UDP协议开发

1. 概述

UDP 用户数据协议(User Datagram Protocol)

2. 作用

将网络流量压缩成数据报形式,提供面向事务的简单信息传输服务,利用IP协议进行数据报传输,提供无连接的、不可靠的数据投递服务

3. 特点

资源消耗小、处理速度快,通常使用在视频、音频等可靠性要求不高的数据传输

  • UDP是无连接的,发送方和接收方相互交换信息使双方同步
  • UDP接受到后不发送确认信息,发送端不知道是否成功,也不会重发
  • UDP传送数据比TCP快,系统开销小,常用于视频、图片以及简单文件传输系统。TCP适合于FTP文件传输系统、超文本传输协议HTTP、简单邮件传输协议SMTP等

4. 协议简介

UDP不需要简历物理链接。在网络中它用于处理数据包,在OSI模型中,它处理第四层传输层,即位于IP协议的上层

4.1 协议格式

分为两个部分:首部和数据

  • 源端口:源端口号,2个字节
  • 目的端口:目的端口号,2个字节
  • 长度:2字节,UDP用户数据报的总长度
  • 校验和:2个字节,用来验证数据字段和头部的“伪首部”

伪首部:在TCP或UDP的数据报格式中,在数据报首部前面增加源IP地址、目的IP地址、IP分组的协议字段、TCP或UDP数据报的总长度,共12字节。只为了保证可以校验套接字的正确性

在这里插入图片描述

5. 代码实例

5.1 服务端

由于UDP协议不需要跟服务端进行连接,所以需要设置UDP为支持广播数据;并且使用 NioDatagramChannel.class 管道

public void bind(int port) { 
    NioEventLoopGroup workGroup = new NioEventLoopGroup(); try { 
    Bootstrap bootstrap = new Bootstrap(); bootstrap .group(workGroup) .channel(NioDatagramChannel.class) //设置Socket参数支持广播 .option(ChannelOption.SO_BROADCAST, true) .handler(new ChineseProverbHandler()); bootstrap.bind(port).channel().closeFuture().await(); } catch (InterruptedException e) { 
    e.printStackTrace(); } finally { 
    workGroup.shutdownGracefully(); } } 
public class ChineseProverbHandler extends SimpleChannelInboundHandler<DatagramPacket> { 
    private static final String[] DICTIONARY = { 
   "只要功夫深,铁棒磨成针。", "洛阳亲友如想问,一片冰心在玉壶"}; @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { 
    //将内容转换为字符串 String req = msg.content().toString(StandardCharsets.UTF_8); System.out.println("请求数据:" + req); if ("谚语字典查询?".equals(req)) { 
    ByteBuf byteBuf = Unpooled.copiedBuffer("谚语查询结果:" + nextQuote(), StandardCharsets.UTF_8); // msg.sender() 获取发送的ip和端口 DatagramPacket returnPacket = new DatagramPacket(byteBuf, msg.sender()); ctx.writeAndFlush(returnPacket); } } private String nextQuote() { 
    //可能会出现并发问题 int nextInt = ThreadLocalRandom.current().nextInt(DICTIONARY.length); return DICTIONARY[nextInt]; } } 

5.2 客户端

public void run(int port) { 
    NioEventLoopGroup workGroup = new NioEventLoopGroup(); try { 
    Bootstrap bootstrap = new Bootstrap(); bootstrap .group(workGroup) .channel(NioDatagramChannel.class) //设置Socket参数支持广播 .option(ChannelOption.SO_BROADCAST, true) .handler(new ChineseProverbHandler()); Channel channel = bootstrap.bind(0).sync().channel(); //向网段内所有机器广播UDP消息 channel.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("谚语字典查询?", StandardCharsets.UTF_8), new InetSocketAddress("255.255.255.255", port))).sync(); //等待15秒用于接受返回数据,然后退出 if (!channel.closeFuture().await(15000)) { 
    System.out.println("查询超时!"); } } catch (InterruptedException e) { 
    e.printStackTrace(); } finally { 
    workGroup.shutdownGracefully(); } } 
public class ChineseProverbHandler extends SimpleChannelInboundHandler<DatagramPacket> { 
    @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { 
    //将内容转换为字符串 String response = msg.content().toString(StandardCharsets.UTF_8); if (response.startsWith("谚语查询结果:")) { 
    System.out.println(response); ctx.close(); } } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199995.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:45
下一篇 2026年3月20日 上午11:45


相关推荐

  • 迭代器iterator遍历集合

    迭代器iterator遍历集合集合分为 list set 和 map list 排列有序 可重复 set 排列无序 不可重复 map 键不可重复 值可重复 排列无序 一般遍历用 for 循环 但是 set 和 map 无序 所以要用迭代器 迭代器是将数据放在一个容器中 并排成一排 迭代器有一个游标 再未遍历之前 这个游标放在第一位元素的前面 一般是迭代器 iterator hasNext 判断游标后面是否有元素 iterator next 是将游标向后移一位 list 集合分为 ArrayList vector LinkedListAr 排列有序

    2026年3月18日
    2
  • 数据库:SQLServer 实现行转列、列转行用法笔记

    数据库:SQLServer 实现行转列、列转行用法笔记

    2020年11月14日
    330
  • jwplayer页面上播放mp3

    jwplayer页面上播放mp3引入 JS js soundRecordi jwplayer js

    2026年3月26日
    2
  • NIFI 简介

    NIFI 简介因为一些原因本人着手从事 nifi 的项目开发 鉴于国内对于该框架的使用较少 并且在不能翻墙的情况下也基本只有官方文档可以使用 所以开个坑来记录一些目前使用到的比较多的组件 nifi 作为一个开源的数据处理工具 其功能非常强大 因为其内部功能是使用的 Java 代码进行的实现 所以在理论上它可以处理绝大部分的数据信息 组件内部通过 processor 和 FlowFile 进行数据交

    2026年3月18日
    2
  • 虚拟机lvm 扩容「建议收藏」

    虚拟机lvm 扩容「建议收藏」1.先在Vmware上,把虚拟机硬盘做扩展,如果有快照存在,磁盘可能是不可编辑状态,先删除快照后再扩展。2.现在打开虚拟机发现系统的磁盘空间已经扩了,但是硬盘分区可用空间没变,还是原来的30G[root@masterhome]#fdisk-lDisk/dev/sda:64.4GB,64424509440bytes,125829120sectorsUnits=…

    2022年6月20日
    32
  • MySQL数据库常见面试题总结

    MySQL数据库常见面试题总结

    2021年4月10日
    140

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号