《Netty实战篇》快速搭建UDP服务端

这篇具有很好参考价值的文章主要介绍了《Netty实战篇》快速搭建UDP服务端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Netty简单介绍

  Netty是一个基于NIO的客户、服务端开发框架,使用Netty能够使你快速和简单的开发出一个网络应用,例如实现某种协议的客户、服务端应用。Netty相当于简化和流程化了网络应用的编程过程,例如基于UDP和TCP的socket开发。
  “快速而简单”并不意味着生成的应用程序将面临可维护性或性能问题。Netty是经过精心设计的,其经验来自FTP、SMTP、HTTP以及各种二进制和基于文本的传统协议的实现。因此,Netty成功地找到了一种不妥协地实现易于开发、性能、稳定性和灵活性的方法。
  其实使用更加简洁的描述的话就是,Netty是对NIO的一次封装,因为JAVA直接使用NIO的话体验感并不是特别好。使用Netty可以实现快速搭建网络通信服务端。
Features(特点)
1. Design(设计性)
2. Ease of use(易用性)
3. Performance(高性能)
4. Security(安全)
5. Community(社区性)

关于Netty的详细介绍会在其他文章与大家见面。

二、关于UDP的内容

  UDP(User Datagram Protocol),用户数据报协议。是OSI(Open System Interconnection,开放式系统互联)中的一种协议,提供面向事务简单不可靠传输服务。它具有下面几个特点:
1.客户端与服务端之间是不需要连接的,即无连接性。
2.传输不可靠,不会因为服务端未正常收到数据或解析数据导致让客户端重新发送。
3.传输过程延迟小。
4.传输效率高。

当然在这里就只是列举了几个相对优秀的特点,这几个特点引发了一部分比较适合的场景:
DNS、TFTP、SNMP、屏幕信息显示、设备数据上传等。

三、JAVA基于Netty搭建UDP服务端

项目框架:基于SpringBoot搭建,更适用于实际生产业务使用。

引入maven库:
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>5.0.0.Alpha2</version>
</dependency>

构建消息处理器:
package com.example.udpDemo.socket.udp;  
  
import cn.hutool.core.util.HexUtil;  
import io.netty.buffer.ByteBuf;  
import io.netty.buffer.Unpooled;  
import io.netty.channel.ChannelHandlerContext;  
import io.netty.channel.SimpleChannelInboundHandler;  
import io.netty.channel.socket.DatagramPacket;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.stereotype.Component;  
  
import java.net.InetSocketAddress;  
  
/**  
 * @author wangdachuan  
 * @version 1.0  
 * @date 2023/3/14 23:12  
 **/@Slf4j  
@Component  
public class UdpServerHandler  extends SimpleChannelInboundHandler<DatagramPacket> {  
  
    @Override  
    protected void messageReceived(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket)  
            throws Exception {  
        InetSocketAddress sender = datagramPacket.sender();  
        String ip = sender.getAddress().getHostAddress();  
        ByteBuf buf = datagramPacket.copy().content();  
        try {  
            byte[] data = new byte[buf.readableBytes()];  
            buf.readBytes(data);  
            String dataStr = HexUtil.encodeHexStr(data);  
            log.info("收到IP:{},发送的数据:{}", ip, dataStr);  
            // 下面进行业务代码处理  
        }catch (Exception e){  
            e.printStackTrace();  
        }  
        // TCP返回数据写法  
        //channelHandlerContext.channel().writeAndFlush("1");  
        // UDP返回数据写法  
        channelHandlerContext.channel().writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(HexUtil.decodeHex("1")), datagramPacket.sender()));  
    }  
}

SimpleChannelInboundHandler 这个是Netty实现UDP协议需要继承的类。
通过重写messageReceived这个方法来对接收到的消息做业务处理。
UDP返回方法需要注意,跟TCP直接返回也有区别,需要通过DatagramPacket进行封装后返回给客户端。

channelHandlerContext.channel().writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(HexUtil.decodeHex("1")), datagramPacket.sender()));  
构建Netty启动器
package com.example.udpDemo.socket.udp;  
  
import io.netty.bootstrap.Bootstrap;  
import io.netty.channel.ChannelFuture;  
import io.netty.channel.ChannelOption;  
import io.netty.channel.EventLoopGroup;  
import io.netty.channel.nio.NioEventLoopGroup;  
import io.netty.channel.socket.nio.NioDatagramChannel;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.stereotype.Component;  
  
/**  
 * @author wangdachuan  
 * @version 1.0  
 * @date 2023/3/14 23:25  
 **/@Slf4j  
@Component  
public class UdpServer {  
  
    public void run(){  
        EventLoopGroup group = new NioEventLoopGroup();  
        try {  
            Bootstrap b = new Bootstrap();  
            b.group(group)  
                    .channel(NioDatagramChannel.class)  
                    .option(ChannelOption.SO_BROADCAST, true)  
                    .handler(new UdpServerHandler());  
            ChannelFuture channelFuture = b.bind(8081).sync();  
            log.info("netty构建的UDP服务启动: [port:{}]", 8081);  
            // 等待服务器socket关闭  
            channelFuture.channel().closeFuture().await();  
        } catch (Exception e) {  
            log.error("netty构建的UDP服务启动异常-" + e.getMessage());  
        } finally {  
            group.shutdownGracefully();  
        }  
    }  
  
}

[NioEventLoopGroup] 是用来处理I/O操作的多线程事件循环器,Netty提供了许多不同的[EventLoopGroup]的实现用来处理不同传输协议。
下面就是实现UDP的重点了:
NioDatagramChannel:是一个能收发UDP包的通道,它实现了Netty用来接收UDP包的通道的接口:DatagramChannel 。
其他的参数都是Netty常见参数。

通过项目启动后加载UDP服务
package com.example.udpDemo.socket;  
  
import cn.hutool.core.thread.ThreadUtil;  
import com.example.udpDemo.socket.udp.UdpServer;  
import jakarta.annotation.Resource;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.boot.ApplicationArguments;  
import org.springframework.boot.ApplicationRunner;  
import org.springframework.stereotype.Component;  
  
/**  
 * @author wangdachuan  
 * @version 1.0  
 * @date 2023/3/14 23:31  
 **/@Slf4j  
@Component  
public class StartRunner implements ApplicationRunner {  
  
    @Resource  
    private UdpServer udpServer;  
  
    @Override  
    public void run(ApplicationArguments args) throws Exception {  
        log.info("开始启动Netty服务");  
        // 启动UDP服务  
        ThreadUtil.execAsync(()->{  
           udpServer.run();  
        });  
    }  
  
}

到这里,通过Netty构建UDP服务端已经开发完成了。

四、验证

项目启动:
netty udp服务端,Netty实战系列,udp,网络,java

收发消息:
netty udp服务端,Netty实战系列,udp,网络,java

五、源码获取

代码地址:源码仓库

六、总结

这是在开发工作中用到的UDP编程代码整理而来,如果大家看的过程中有觉得不对的,或者更好的方法,希望大家能够指出来。
希望大家多多关注+点赞+收藏 🙏🙏,你们的鼓励是我不断前进的动力💪💪!!!文章来源地址https://www.toymoban.com/news/detail-729768.html

到了这里,关于《Netty实战篇》快速搭建UDP服务端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java netty发送接收(TCP、UDP)

    最下方附项目地址 项目地址 https://gitee.com/xn-mg/netty_kafka

    2024年02月16日
    浏览(31)
  • SpringBoot 2.7 集成 Netty 4 实现 UDP 通讯

    Netty 作为异步通讯框架,支持多种协议。本文将介绍基于 SpringBoot 2.7 整合 Netty 4 实现 UDP 通讯。 netty 版本: 3.1 服务端事务处理器(DemoUdpNettyServerHandler) 代码说明: 这里使用线程池来异步处理事务,提高系统并发性能 3.2 服务端连接类(InitUdpNettyServer) 代码说明: UDP 协议需要使用

    2024年02月03日
    浏览(23)
  • Netty的TCP和UDP套接字支持

    Netty 是一个网络通信框架,支持 TCP 和 UDP 两种套接字协议。在 Netty 中,我们可以很方便地创建 TCP 和 UDP 服务器和客户端,通过 Channel 和 ChannelPipeline 进行数据传输和消息处理。 下面分别介绍 Netty 对 TCP 和 UDP 的支持。 Netty 对 TCP 的支持非常完善,提供了一系列的 ChannelHandl

    2024年02月11日
    浏览(28)
  • Netty实战专栏 | Java网络编程深入解析

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Netty实战专栏 ✨特色专栏: MySQL学习 🥭本文内容:Netty实战专栏 | Java网络编程深入解析 🖥️个人小站 :个人博客,欢迎大家访问 📚个人知识

    2024年02月06日
    浏览(42)
  • [AIGC] 快速掌握Netty,打造高性能IM服务器!

    前言:Netty 是一个非常优秀的网络应用程序框架,支持高并发、高性能的网络通信,适用于开发各种服务器程序,如即时通讯、游戏、物联网等。使用 Netty 可以大大提升服务器程序的性能和可靠性。本文将介绍 Netty 的基本原理和使用方法,并给出一个简单的 IM 程序示例,帮

    2024年02月06日
    浏览(35)
  • springboot+Netty搭建MQTT协议的服务端

    本文基于基础版的netty实现mqtt 在此功能基础上,进行了功能强化,新增了用户鉴权、多用户订阅推送,qos2级别消息处理,后续新增topic filter功能,本人会持续更新 Netty是业界最流行的nio框架之一,结合springboot可以满足快速开发 MQTT(Message Queuing Telemetry Transport,消息队列遥测

    2024年02月16日
    浏览(40)
  • 快速入门Java NIO(Not I/O)的网络通信框架--Netty

    了解netty前需要对nio有一定认识,该笔记基础来自bilinbili黑马,在此基础上自己学习的笔记,添加了一些自己的理解 了解java 非阻塞io编程 1.1 Netty 是什么? Netty 是一个异步(基于多线程)的、基于事件驱动(多路复用的那写事件驱动)的网络应用框架,用于快速开发可维护、高性能的

    2024年01月17日
    浏览(39)
  • 【netty系列-01】深入理解网络通信基本原理和tcp/ip协议

    Netty系列整体栏目 内容 链接地址 【一】深入理解网络通信基本原理和tcp/ip协议 https://zhenghuisheng.blog.csdn.net/article/details/136359640 【二】深入理解Socket本质和BIO https://zhenghuisheng.blog.csdn.net/article/details/136549478 在最初的网络中,是借鉴于这个OSI七层网络模型,而在实际开发应用中

    2024年03月17日
    浏览(49)
  • SpringBoot搭建Netty+Socket+Tcp服务端和客户端

    yml配置:    完成,启动项目即可自动监听对应端口 这里为了测试,写了Main方法,可以参考服务端,配置启动类 ,实现跟随项目启动   ......想写就参考服务端...... 有测试的,,,但是忘记截图了................

    2024年02月15日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包