南昌市物联网技防平台-后台
钟日健
2021-02-27 f19d7d458e175b0e4beb8aec96a541dd3e8ced25
blade-service/blade-jfpts/src/main/java/org/springblade/jfpt/nettyUdpServer/server/UdpServer.java
@@ -17,7 +17,7 @@
import java.util.concurrent.Executors;
/**
 * Created by wangshikai on 2016/7/18.
 * updServer udp服务端
 */
public class UdpServer {
   private static Logger LOG = LoggerFactory.getLogger(UdpServer.class);
@@ -73,51 +73,57 @@
   //使用ChannelPipeline实现自定义IO
   //Channel channel;
   public void run() {
      //InetSocketAddress socketAddress = new InetSocketAddress("s16s652780.51mypc.cn", 21403);
      //启动服务
      EventLoopGroup workerGroup = new NioEventLoopGroup();
      //优化使用的线程
      final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
      Thread thread = new Thread(new Runnable() {
         @Override
         public void run() {
            //InetSocketAddress socketAddress = new InetSocketAddress("s16s652780.51mypc.cn", 21403);
            //启动服务
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            //优化使用的线程
            final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
      try {
         Bootstrap b = new Bootstrap();//udp不能使用ServerBootstrap
         b.group(workerGroup).channel(NioDatagramChannel.class)//设置UDP通道
            //设置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 {
               Bootstrap b = new Bootstrap();//udp不能使用ServerBootstrap
               b.group(workerGroup).channel(NioDatagramChannel.class)//设置UDP通道
                  //设置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)// 支持广播
            .option(ChannelOption.SO_RCVBUF, 2048 * 1024)// 设置UDP读缓冲区为2M
            .option(ChannelOption.SO_SNDBUF, 1024 * 1024);// 设置UDP写缓冲区为1M
                  })//初始化处理器
                  //true / false 多播模式(UDP适用),可以向多个主机发送消息
                  .option(ChannelOption.SO_BROADCAST, true)// 支持广播
                  .option(ChannelOption.SO_RCVBUF, 2048 * 1024)// 设置UDP读缓冲区为2M
                  .option(ChannelOption.SO_SNDBUF, 1024 * 1024);// 设置UDP写缓冲区为1M
         // 绑定端口,开始接收进来的连接
         ChannelFuture f = b.bind(port).sync();
         //获取channel通道
         //channel=f.channel();
         System.out.println("UDP Server 启动!");
         // 等待服务器 socket 关闭 。
         // 这不会发生,可以优雅地关闭服务器。
         f.channel().closeFuture().sync();
      } catch (InterruptedException e) {
         e.printStackTrace();
      } finally {
         // 优雅退出 释放线程池资源
         group.shutdownGracefully();
         workerGroup.shutdownGracefully();
      }
               // 绑定端口,开始接收进来的连接
               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();
   }
}