文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Springboot中怎么用Netty开启UDP服务方式

2023-06-25 15:00

关注

这篇文章主要介绍了Springboot中怎么用Netty开启UDP服务方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Netty

Netty是一种提供网络编程的工具,是对socket编程的一例优秀的包装,支持TCP、UDP、FTP等协议。我们可以用Netty开发自己的http服务器、udp服务器、FTP服务器,RPC服务器等

Netty大受欢迎的原因:

Netty支持NIO编程,NIO的持支,可以大大提升并发性能。

Netty NIO的一个特性是零拷贝,直接在内存中开辟一块,剩去了socket缓冲区,

接下来写一个简单的udp demo。大体思路:

新建一个springboot项目。在pom中引入jar

pom.xml

       <!--springboot version 我用的是2.1.3.RELEASE--> <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>            <version>2.1.3.RELEASE</version>        </dependency>              <!--web模块的启动器 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- netty依赖 springboot2.x自动导入版本 -->        <dependency>            <groupId>io.netty</groupId>            <artifactId>netty-all</artifactId>        </dependency>        <!-- 这里我用到了@slf4j 所以引入这个jar -->      <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <optional>true</optional>        </dependency>

创建NettyUDPServer

Channel 通道的类型

Bootstrap 是 Netty 提供的一个便利的工厂类,可以通过它来完成 Netty 的客户端或服务器端的 Netty 初始化。

package com.demo.udpdemo.UDPServer;import com.demo.udpdemo.handler.BootNettyUdpSimpleChannelInboundHandler;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;@Slf4jpublic class BootNettyUdpServer {        public void bind(int port) {        log.info("-------------------------------udpServer-------------------------");        //表示服务器连接监听线程组,专门接受 accept 新的客户端client 连接        EventLoopGroup bossLoopGroup  = new NioEventLoopGroup();        try {            //1,创建netty bootstrap 启动类            Bootstrap serverBootstrap = new Bootstrap();            //2、设置boostrap 的eventLoopGroup线程组            serverBootstrap = serverBootstrap.group(bossLoopGroup);            //3、设置NIO UDP连接通道            serverBootstrap = serverBootstrap.channel(NioDatagramChannel.class);            //4、设置通道参数 SO_BROADCAST广播形式            serverBootstrap = serverBootstrap.option(ChannelOption.SO_BROADCAST, true);            //5、设置处理类 装配流水线            serverBootstrap = serverBootstrap.handler(new BootNettyUdpSimpleChannelInboundHandler());            //6、绑定server,通过调用sync()方法异步阻塞,直到绑定成功            ChannelFuture f = serverBootstrap.bind(port).sync();            log.info(BootNettyUdpServer.class.getName()+" started and listend on "+f.channel().localAddress());            //7、监听通道关闭事件,应用程序会一直等待,直到channel关闭            f.channel().closeFuture().sync();        } catch (Exception e) {            // TODO: handle exception        } finally {            System.out.println("netty udp close!");            //8 关闭EventLoopGroup,            bossLoopGroup.shutdownGracefully();        }    }}

NettyUdpSimpleChannelInboundHandler

package com.demo.udpdemo.handler;import io.netty.buffer.Unpooled;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.channel.socket.DatagramPacket;import io.netty.util.CharsetUtil;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class BootNettyUdpSimpleChannelInboundHandler extends SimpleChannelInboundHandler<DatagramPacket> {    @Override    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {        try {            String strdata = msg.content().toString(CharsetUtil.UTF_8);            //打印收到的消息            log.info("---------------------receive data--------------------------");            log.info(strdata);            log.info("---------------------receive data--------------------------");            //收到udp消息后,可通过此方式原路返回的方式返回消息,例如返回时间戳            ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("ok", CharsetUtil.UTF_8), msg.sender()));        } catch (Exception e) {        }    }}

修改启动类,启动执行UDPServer.bind方法,启动udpServer

@SpringBootApplication@EnableAsyncpublic class UdpDemoApplication implements CommandLineRunner {    public static void main(String[] args) {        SpringApplication app = new SpringApplication(UdpDemoApplication.class);        app.run(args);    }    @Async    @Override    public void run(String... args){       new BootNettyUdpServer().bind(51000);    }}

test

在test类下面,新建一个test方法

sendUdpRequestTest

  //定义客户端ip  private static final String SERVER_HOSTNAME = "127.0.0.1";    // 服务器端口    private static final int SERVER_PORT = 51000;    // 本地发送端口    private static final int LOCAL_PORT = 8888; @Test    public void sendUdpRequestTest() {        try {            // 1,创建udp服务。通过DatagramSocket对象。            DatagramSocket socket = new DatagramSocket(LOCAL_PORT);            // 2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress            // address, int port)            byte[] buf = "hello".getBytes();            DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(SERVER_HOSTNAME),                    SERVER_PORT);            // 3,通过socket服务,将已有的数据包发送出去。通过send方法。            socket.send(dp);            // 4,关闭资源。            socket.close();        } catch (IOException e) {            e.printStackTrace();        }    }

结果

2021-09-03 13:14:47.912 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------
2021-09-03 13:14:47.912 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : 你好,世界
2021-09-03 13:14:47.912 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------
2021-09-03 13:16:11.748 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------
2021-09-03 13:16:11.748 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : 你好,世界
2021-09-03 13:16:11.748 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------
2021-09-03 13:17:11.664 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------
2021-09-03 13:17:11.664 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : hello
2021-09-03 13:17:11.664 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------
2021-09-03 13:17:32.714 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------
2021-09-03 13:17:32.714 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : hello
2021-09-03 13:17:32.714 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------

感谢你能够认真阅读完这篇文章,希望小编分享的“Springboot中怎么用Netty开启UDP服务方式”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯