From f1d079f9c0b3d384090477ca54e0548373d62b57 Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Thu, 16 Jan 2025 11:56:39 +0800
Subject: [PATCH] 配置修改
---
src/main/java/com/genersoft/iot/vmp/netty/server/UdpServer.java | 93 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 93 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/netty/server/UdpServer.java b/src/main/java/com/genersoft/iot/vmp/netty/server/UdpServer.java
new file mode 100644
index 0000000..651a55b
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/netty/server/UdpServer.java
@@ -0,0 +1,93 @@
+package com.genersoft.iot.vmp.netty.server;
+
+import com.genersoft.iot.vmp.netty.config.MyDecoder;
+import com.genersoft.iot.vmp.netty.handle.UdpServerHandler;
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.*;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.nio.NioDatagramChannel;
+import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
+import io.netty.util.concurrent.DefaultEventExecutorGroup;
+import io.netty.util.concurrent.EventExecutorGroup;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+/**
+ * updServer udp服务端
+ *
+ * @author zhongrj
+ * @date 2023-02-21
+ */
+@Component
+public class UdpServer {
+
+ private static Logger LOG = LoggerFactory.getLogger(UdpServer.class);
+
+
+ //给管道抽象出接口,给Channel更多的能力和配置,例如Channel的状态,参数,IO操作
+ //使用ChannelPipeline实现自定义IO
+ //Channel channel;
+ @Async("taskExecutor")
+ public void run(int port) {
+// Thread thread = new Thread(new Runnable() {
+// @Override
+// public void run() {
+ //启动服务
+ EventLoopGroup workerGroup = new NioEventLoopGroup();
+ //优化使用的线程
+ final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
+
+ try {
+ //udp不能使用ServerBootstrap
+ Bootstrap b = new Bootstrap();
+ //设置UDP通道
+ b.group(workerGroup).channel(NioDatagramChannel.class)
+ //设置udp的管道工厂
+ .handler(new ChannelInitializer<NioDatagramChannel>() {
+ //NioDatagramChannel标志着是UDP格式的
+ @Override
+ protected void initChannel(NioDatagramChannel ch)
+ throws Exception {
+ // TODO Auto-generated method stub
+ //创建一个执行Handler的容器
+ ChannelPipeline pipeline = ch.pipeline();
+// pipeline.addLast(new StringDecoder());
+ pipeline.addLast("decoder",new MyDecoder());
+// pipeline.addLast(new StringEncoder());
+ pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 4, 4, -8, 0));
+ //执行具体的自定义处理器
+ pipeline.addLast(group, "handler", new UdpServerHandler());
+ }
+
+ })//初始化处理器
+
+ //true / false 多播模式(UDP适用),可以向多个主机发送消息
+ .option(ChannelOption.SO_BROADCAST, true)
+ // 设置UDP读缓冲区为2M
+ .option(ChannelOption.SO_RCVBUF, 2048 * 1024)
+ // 设置UDP写缓冲区为1M
+ .option(ChannelOption.SO_SNDBUF, 1024 * 1024);
+
+ // 绑定端口,开始接收进来的连接
+ ChannelFuture f = b.bind(port).sync();
+ //获取channel通道
+ //channel=f.channel();
+ System.out.println("UDP Server 启动,端口:" + port);
+ // 等待服务器 socket 关闭 。
+ // 这不会发生,可以优雅地关闭服务器。
+ f.channel().closeFuture().sync();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ //优雅退出 释放线程池资源
+ group.shutdownGracefully();
+ workerGroup.shutdownGracefully();
+ }
+// }
+// });
+// thread.start();
+ }
+
+}
--
Gitblit v1.9.3