Netty网络编程(五):使用UDP协议

这篇具有很好参考价值的文章主要介绍了Netty网络编程(五):使用UDP协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

今天我将会给大家介绍如何在netty中使用UDP协议。

UDP协议

UDP( User Datagram Protocol ),也叫用户数据报协议。

UDP 的主要功能和亮点并不在于它引入了什么特性,而在于它忽略的那些特性:不保证消息交付,不保证交付顺序,不跟踪连接状态,不需要拥塞控制。

我们来看一下UDP的数据包:
Netty网络编程(五):使用UDP协议

UDP是一种无连接的协议,发送者只管发送数据包即可,并不负责处理和保证数据是否成功发送,数据是否被处理完成等。它的唯一作用就是发送。

在JDK中表示UDP的有一个专门的类叫做:java.net.DatagramPacket,在NIO中还有一个java.nio.channels.DatagramChannel,专门负责处理UDP的channel。

这里我们要将的是netty,netty中对于UDP协议也有上面的两个类,名字虽然是一样的,但是对应的包不同。他们分别是:

io.netty.channel.socket.DatagramPacket 和 io.netty.channel.socket.DatagramChannel,当然netty中的这两个类是对JDK自带类的增强。

先看一下netty中DatagramPacket的定义:

public class DatagramPacket
        extends DefaultAddressedEnvelope<ByteBuf, InetSocketAddress> implements ByteBufHolder 

DatagramPacket类实现了ByteBufHolder接口,表示它里面存放的是ByteBuf。然后他又继承自DefaultAddressedEnvelope,这个类是对地址的封装,其中ByteBuf表示传递消息的类型,InetSocketAddress表示目标的地址,它是一个IP地址+端口号的封装。

从上面的UDP协议我们知道,UDP只需要知道目标地址和对应的消息即可,所以DatagramPacket中包含的数据已经够用了。

DatagramChannel是用来传递DatagramPacket的,因为DatagramChannel是一个接口,所以一般使用NioDatagramChannel作为真正使用的类。

String和ByteBuf的转换

之前我们讲到过,netty中的channel只接受ByteBuf数据类型,如果直接写入String会报错,之前的系列文章中,我们讲过两种处理方法,第一种是使用ObjectEncoder和ObjectDecoder在写入ByteBuf之前,对对象进行序列化,这一种不仅适合String,也适合Object对象。

第二种是使用StringEncoder和StringDecoder专门处理String的encode和decode,这种处理只能处理String的转换,对Object无效。

如果你不想使用这些encoder和decoder还可以直接使用ByteBuf和String进行转换。

比如要将String写入ByteBuf可以调用Unpooled.copiedBuffer的命令如下:

Unpooled.copiedBuffer("开始广播", CharsetUtil.UTF_8)

将ByteBuf转换成为String则可以调用:

byteBuf.toString(CharsetUtil.UTF_8)

构建DatagramPacket

DatagramPacket总共可以接受三个参数,分别是要发送的数据data,要接收数据包的地址和要发送数据包的地址。

这里我们并不关心发送数据包的地址,那么只需要两个参数即可,对于客户端来说,我们发送一个”开始广播“的消息给服务器端,告诉服务器端可以向客户发送回复消息了,如下所示:

new DatagramPacket(
                    Unpooled.copiedBuffer("开始广播", CharsetUtil.UTF_8),
                    SocketUtils.socketAddress("255.255.255.255", PORT))

上我们使用SocketUtils.socketAddress创建了一个特殊的地址,255.255.255.255是一个特殊的广播地址,意味着所有的主机,因为我们的客户端并不知道服务器的地址,所以使用255.255.255.255来广播。

构建好的DatagramPacket,里面有一个sender()方法,可以用来获取客户端的地址,所以在服务器端可以这样构建要发送的packge:

new DatagramPacket(
                    Unpooled.copiedBuffer("广播: " + nextQuote(), CharsetUtil.UTF_8), packet.sender())

启动客户端和服务器

UDP的客户端和服务器启动和socket稍微有所不同,如果是socket,那么使用的channel是NioSocketChannel,如果是UDP,则使用的是NioDatagramChannel。如下是服务器端启动的代码:

EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioDatagramChannel.class)
             .option(ChannelOption.SO_BROADCAST, true)
             .handler(new UDPServerHandler());

            b.bind(PORT).sync().channel().closeFuture().await();
        } finally {
            group.shutdownGracefully();
        }

注意,这里我们需要设置ChannelOption.SO_BROADCAST为true,因为UDP是以广播的形式发送消息的。

客户端的实现和socket稍微有所不同,下面是客户端的启动实现:

 EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioDatagramChannel.class)
             .option(ChannelOption.SO_BROADCAST, true)
             .handler(new UDPClientHandler());

            Channel ch = b.bind(0).sync().channel();

对于UDP来说,并不存在地址绑定一说,所以上Bootstrap调用bind(0)。

总结

本文讲解了netty中UDP协议的实现,UDP相较于Socket连接而言更加简单。文章来源地址https://www.toymoban.com/news/detail-427036.html

到了这里,关于Netty网络编程(五):使用UDP协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络编程】TCP,UDP协议详解

    小亭子正在努力的学习编程,接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~   目录 前言 TCP协议 TCP协议特点 TCP协议通信场景 TCP协议的几个重要机制 一、

    2023年04月19日
    浏览(53)
  • [网络编程]UDP协议,基于UDP协议的回显服务器

    目录 1.UDP协议介绍 2.UDP协议在Java中的类 2.1DatagramSocket类 2.2DatagramPacket 3.回显服务器 3.1Sever端  3.2Client端   UDP协议是一种网络协议,它是无连接的,全双工,并且是面向数据报,不可靠的一种协议。 常用于在线视频播放,游戏这种实时性要求比较高的应用。或者无需可靠传输

    2024年01月22日
    浏览(56)
  • 【QT网络编程】实现UDP协议通信

    Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了 一种无需建立连接就可以发送封装的 IP 数据包的方法 。RFC 768 描述了 UDP。 UDP协议根据消息传送模式可以分为: 单播(Unicast)、组播(Multicast)和广播(

    2024年02月02日
    浏览(56)
  • 网络编程-UDP协议(发送数据和接收数据)

    需要了解TCP协议的,可以看往期文章 https://blog.csdn.net/weixin_43860634/article/details/133274701 通过此图,可以了解UDP所在哪一层级中 发送数据 接收数据 运行效果 1、 UDP是面向无连接通信协议 (通俗一点讲,就是不管是否已连接成功,直接发送数据),该特性正好与TCP协议相反,

    2024年02月07日
    浏览(42)
  • Java网络编程 *TCP与UDP协议*

    把分布在 不同地理区域 的具有独立功能的计算机, 通过通信设备与线路 连接起来,由功能完善的软件实现资源共享和信息传递的 系统 简单来说就是把不同地区的计算机通过设备连接起来,实现不同地区之前的数据传输 网络编程 是借助计算机网络,实现我们所写的程序,在不同

    2024年01月16日
    浏览(58)
  • 「网络编程」传输层协议_ UDP协议学习_及原理深入理解

    「前言」文章内容大致是传输层协议,UDP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) HTTP协议普通用户认为是将请求和响应直接发送到了网络当中。但实际应用层需要先将数据交给传输层,由传输层对数据做进一步处理后再将数据继续向下

    2024年02月17日
    浏览(45)
  • 网络编程——TCP/IP协议族(IP协议、TCP协议和UDP协议……)

    1、IP协议简介 IP协议又称 网际协议 特指为实现在一个相互连接的网络系统上从源地址到目的地传输数据包(互联网数据包)所提供必要功能的协议,是网络层中的协议。 2、特点 不可靠 :它不能保证IP数据包能成功地到达它的目的地,仅提供尽力而为的传输服务 无连接 :IP 并不

    2024年02月13日
    浏览(75)
  • 【网络编程】深入了解UDP协议:快速数据传输的利器

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,请在评论区指

    2024年02月09日
    浏览(54)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(84)
  • 【从入门到起飞】JavaSE—网络编程三要素,软件架构,UDP协议

    在网络通信协议下,不同计算机上运行的程序,进行的数据传输 简而言之,就是可以把自己电脑上的资料 通过代码 传到其他人的电脑上 (对画质要求不高时使用) 不需要开发客户端,只需要页面+服务端 用户不需要下载,打开浏览器就能用 如果应用过大,用户体验会受到

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包