上饶市公安局wvp平台
zhongrj
2023-03-04 9f0367b2515cec04ef6111452e3115bfe6acd405
udp server 启动修改(使用线程池)
1 files modified
117 ■■■■ changed files
src/main/java/com/genersoft/iot/vmp/netty/server/UdpServer.java 117 ●●●● patch | view | raw | blame | history
src/main/java/com/genersoft/iot/vmp/netty/server/UdpServer.java
@@ -11,77 +11,80 @@
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);
    private static Logger LOG = LoggerFactory.getLogger(UdpServer.class);
    //给管道抽象出接口,给Channel更多的能力和配置,例如Channel的状态,参数,IO操作
    //使用ChannelPipeline实现自定义IO
    //Channel channel;
    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);
    //给管道抽象出接口,给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(new StringEncoder());
                                //执行具体的自定义处理器
                                pipeline.addLast(group, "handler", new UdpServerHandler());
                            }
        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(new StringEncoder());
                            //执行具体的自定义处理器
                            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);
                    })//初始化处理器
                    //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();
    }
            // 绑定端口,开始接收进来的连接
            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();
    }
}