Springboot中用Netty开启UDP服务方式
2023年7月15日发(作者:)
Springboot中⽤Netty开启UDP服务⽅式⽬录Netty新建⼀个springboot项⽬。在pom中引⼊jar创建NettyUDPServerNettyUdpSimpleChannelInboundHandler修改启动类,启动执⾏⽅法,启动udpServertest结果NettyNetty是⼀种提供⽹络编程的⼯具,是对socket编程的⼀例优秀的包装,⽀持TCP、UDP、FTP等协议。我们可以⽤Netty开发⾃⼰的http服务器、udp服务器、FTP服务器,RPC服务器等Netty⼤受欢迎的原因:并发⾼Netty⽀持NIO编程,NIO的持⽀,可以⼤⼤提升并发性能。传输快Netty NIO的⼀个特性是零拷贝,直接在内存中开辟⼀块,剩去了socket缓冲区,封装好接下来写⼀个简单的udp demo。⼤体思路:写⼀个netty的 基于UDP的Server ⽤来接受数据写个⼀处理类,⽤于对接受的数据进⾏处理,然后返回信息新建⼀个springboot项⽬。在pom中引⼊
spring-boot-starter E
spring-boot-starter-web netty-all
tlombok lombok true 创建NettyUDPServerChannel 通道的类型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 ver;import ttyUdpSimpleChannelInboundHandler;import rap;import lFuture;import lOption;import oopGroup;import ntLoopGroup;import agramChannel;import 4j;/** * @author
*/@Slf4jpublic class BootNettyUdpServer { /** * 启动服务 */ public void bind(int port) { ("-------------------------------udpServer-------------------------"); //表⽰服务器连接监听线程组,专门接受 accept 新的客户端client 连接 EventLoopGroup bossLoopGroup = new NioEventLoopGroup(); try { //1,创建netty bootstrap 启动类 Bootstrap serverBootstrap = new Bootstrap(); //2、设置boostrap 的eventLoopGroup线程组 serverBootstrap = (bossLoopGroup); //3、设置NIO UDP连接通道 serverBootstrap = l(); //4、设置通道参数 SO_BROADCAST⼴播形式 serverBootstrap = (_BROADCAST, true); //5、设置处理类 装配流⽔线 serverBootstrap = r(new BootNettyUdpSimpleChannelInboundHandler()); //6、绑定server,通过调⽤sync()⽅法异步阻塞,直到绑定成功 ChannelFuture f = (port).sync(); (e()+" started and listend on "+l().localAddress()); //7、监听通道关闭事件,应⽤程序会⼀直等待,直到channel关闭 l().closeFuture().sync(); } catch (Exception e) { // TODO: handle exception } finally { n("netty udp close!"); //8 关闭EventLoopGroup, wnGracefully(); } }}NettyUdpSimpleChannelInboundHandlerpackage r;import ed;import lHandlerContext;import ChannelInboundHandler;import amPacket;import tUtil;import 4j;/** * @author
*/@Slf4jpublic class BootNettyUdpSimpleChannelInboundHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { try { String strdata = t().toString(_8); //打印收到的消息 ("---------------------receive data--------------------------"); (strdata); ("---------------------receive data--------------------------"); //收到udp消息后,可通过此⽅式原路返回的⽅式返回消息,例如返回时间戳 ndFlush(new DatagramPacket(Buffer("ok", _8), ())); } catch (Exception e) { } }}修改启动类,启动执⾏⽅法,启动udpServer@SpringBootApplication@EnableAsyncpublic class UdpDemoApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication app = new SpringApplication(); (args); } @Async @Override public void 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, , ame(SERVER_HOSTNAME), SERVER_PORT); // 3,通过socket服务,将已有的数据包发送出去。通过send⽅法。 (dp); // 4,关闭资源。 (); } catch (IOException e) { tackTrace(); } }结果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 :hello2021-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 :hello2021-09-03 13:17:32.714 INFO 11608 --- [ntLoopGroup-2-1] .BootNettyUdpSimpleChannelInboundHandler : ---------------------receive data--------------------------以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689409722a243467.html
评论列表(0条)