返回顶部
首页 > 资讯 > 精选 >Springboot中怎么用Netty开启UDP服务方式
  • 733
分享到

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

2023-06-25 15:06:00 733人浏览 薄情痞子
摘要

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

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

Netty

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

Netty大受欢迎的原因:

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

  • 传输快

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

  • 封装好

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

  • 写一个netty的 基于UDP的Server 用来接受数据

  • 写个一处理类,用于对接受的数据进行处理,然后返回信息

新建一个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 通道的类型

  • NiOSocketChannel, 代表异步的客户端 TCP Socket 连接.

  • NioServerSocketChannel, 异步的服务器端 TCP Socket 连接.

  • NioDatagramChannel, 异步的 UDP 连接

  • NioSctpChannel, 异步的客户端 Sctp 连接.

  • NioSctpServerChannel, 异步的 Sctp 服务器端连接.

  • OioSocketChannel, 同步的客户端 TCP Socket 连接.

  • OioServerSocketChannel, 同步的服务器端 TCP Socket 连接.

  • OioDatagramChannel, 同步的 UDP 连接

  • OioSctpChannel, 同步的 Sctp 服务器端连接.

  • OioSctpServerChannel, 同步的客户端 TCP Socket 连接.

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服务方式”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Springboot中怎么用Netty开启UDP服务方式

本文链接: https://lsjlt.com/news/305668.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Springboot中怎么用Netty开启UDP服务方式
    这篇文章主要介绍了Springboot中怎么用Netty开启UDP服务方式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。NettyNetty是一种提供网络编程的工具,是对so...
    99+
    2023-06-25
  • Springboot中用 Netty 开启UDP服务方式
    目录Netty新建一个springboot项目。在pom中引入jar创建NettyUDPServerNettyUdpSimpleChannelInboundHandler修改启动类,...
    99+
    2024-04-02
  • linux怎么开启udp服务
    要在Linux上开启UDP服务,可以按照以下步骤进行操作:1. 打开终端窗口,使用root用户或具有管理员权限的用户登录。2. 使用...
    99+
    2023-10-09
    linux
  • springboot怎样开启声明式事务
    这篇文章给大家介绍springboot怎样开启声明式事务,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot...
    99+
    2023-06-19
  • windows7怎么开启telnet服务方式介绍
    windows7怎么开启telnet服务呢,这个Telnet是电脑中进行的一项远程登陆服务协议和方法,用户假如应用系统的网络服务的话就需要该服务,不过一般客户不清楚如何开启这个服务,其实很简单,根据进到控制面板找到程序就能进一步开启了,下面...
    99+
    2023-07-11
  • Netty分布式FastThreadLocal的set方法怎么用
    本文小编为大家详细介绍“Netty分布式FastThreadLocal的set方法怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Netty分布式FastThreadLocal的set方法怎么用”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-29
  • SpringBoot 任务调度动态设置方式(不用重启服务)
    目录SpringBoot 任务调度动态设置1.初始化入口(注解 @PostConstruct)2.任务调度类SpringBoot 调度任务1.首先需要用@EnableScheduli...
    99+
    2024-04-02
  • Windows11中怎么启用开发者模式
    本篇内容主要讲解“Windows11中怎么启用开发者模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Windows11中怎么启用开发者模式”吧! ...
    99+
    2023-04-29
    windows11
  • 使用springboot如何实现开启声明式事务
    这期内容当中小编将会给大家带来有关使用springboot如何实现开启声明式事务,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。springboot开启事务很简单,只需要一个注解@Transactional...
    99+
    2023-05-31
    springboot 声明式事务
  • linux中怎么开启telnet服务
    linux中怎么开启telnet服务,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。方法: 切换至root用户; 如果Linux没有安装telnet服务需要先安装...
    99+
    2023-06-12
  • debian中怎么开启ssh服务
    要在Debian中开启SSH服务,可以按照以下步骤操作: 安装OpenSSH服务器软件包: sudo apt-get updat...
    99+
    2024-03-13
    debian
  • win10上帝模式怎么开启 win10上帝模式开启方法
      win10上帝模式这种“工具箱”文件夹还是非常方便实用的,那么win10上帝模式怎么开启呢?今天我们小编就为大家分享win10上帝模式开启方法,一起来学学吧! win10系统正式版官方下载地址...
    99+
    2023-06-15
    win10 上帝模式 上帝 模式 开启 方法
  • linux服务中开启防火墙的两种方式
    存在以下两种方式: 一、service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptables:未运行防火墙。 开启防火墙: [root@centos6...
    99+
    2022-06-04
    linux 防火墙
  • Centos6.7中怎么怎么开启sshd服务
    Centos6.7中怎么怎么开启sshd服务,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用“chkconfig --list | grep sshd”命令来查看sshd服务...
    99+
    2023-06-10
  • 云服务器开启虚拟化方式
    云服务器的优点有很多,其中最明显的是高性能和灵活性。传统的物理服务器需要依赖于物理机,而云服务器则可以在多个虚拟机之间共享计算资源,实现高效的资源利用和负载均衡,提高了服务器的整体性能。同时,云服务器还具有更加灵活的资源分配方式,可以根据用...
    99+
    2023-10-27
    方式 服务器
  • win7怎么开启任务管理器快捷打开方式
    本篇内容介绍了“win7怎么开启任务管理器快捷打开方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法一:在任务栏空白处右键点击,然后选择...
    99+
    2023-06-28
  • Springboot 内部服务调用方式
    目录Eureka注册的服务之间互相调用1.请求方2.接收方多模块化,服务间调用的坑问题背景解决办法Eureka注册的服务之间互相调用 1.请求方 启动类添加注解,扫描Eureka 中...
    99+
    2024-04-02
  • 使用run()方法怎么启动SpringBoot
    本篇文章给大家分享的是有关使用run()方法怎么启动SpringBoot,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。入口通常一个简单的SpringBoot基础项目我们会有如下...
    99+
    2023-06-14
  • 开传奇云服务器怎么开启游戏模式
    登录云服务器控制台:首先需要登录云服务器控制台,输入相应的账号和密码进行登录。控制台会自动将用户分配到相应的云服务器节点上,以便用户可以通过云服务器进行游戏。 选择游戏模式:在云服务器控制台中,选择需要开启的游戏模式,如“自动战斗”、“快...
    99+
    2023-10-28
    模式 服务器 传奇
  • 阿里云服务器开启ipv6服务怎么开启
    首先,需要了解如何开启阿里云的IPv6服务。首先需要打开阿里云的控制台应用,进入到“应用设置”界面,然后点击“服务IPv6”选项。在IPv6选项界面中,可以看到阿里云提供的IPv6支持服务,如ECS、OSS、DNS等。选择需要开启的服务,然...
    99+
    2023-10-28
    阿里 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作