• Netty(六)UDP在netty中的使用


    关于UDP的介绍,这里不在阐述。
    相比于TCP而言,UDP不存在客户端和服务端的实际链接,因此不需要为连接(ChannelPipeline)设置handler。

    服务端:

     1 public void run(int port)throws Exception{
     2         EventLoopGroup group = new NioEventLoopGroup();
     3         try {
     4             Bootstrap b = new Bootstrap();
     5             b.group(group).channel(NioDatagramChannel.class)
     6                     .option(ChannelOption.SO_BROADCAST,true)
     7                     .handler(new UdpServerHandler());
     8 
     9             b.bind(port).sync().channel().closeFuture().await();
    10         }
    11         finally {
    12             group.shutdownGracefully();
    13         }
    14     }
     1     @Override
     2     public void messageReceived(ChannelHandlerContext channelHandlerContext,
     3                                    DatagramPacket datagramPacket) throws Exception {
     4         // 因为Netty对UDP进行了封装,所以接收到的是DatagramPacket对象。
     5         String req = datagramPacket.content().toString(CharsetUtil.UTF_8);
     6         System.out.println(req);
     7 
     8         if("啪啪啪来拉!!!".equals(req)){
     9             channelHandlerContext.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(
    10                     "结果:",CharsetUtil.UTF_8),datagramPacket.sender()));
    11         }
    12     }

    客户端:

        public void run(int port)throws Exception{
            EventLoopGroup group = new NioEventLoopGroup();
            try {
                Bootstrap b = new Bootstrap();
                b.group(group).channel(NioDatagramChannel.class)
                        .option(ChannelOption.SO_BROADCAST,true)
                        .handler(new UdpClientHandler());
    
                Channel ch = b.bind(0).sync().channel();
                // 向网段类所有机器广播发UDP
                ch.writeAndFlush(
                        new DatagramPacket(
                                Unpooled.copiedBuffer("啪啪啪来拉!!!", CharsetUtil.UTF_8),
                                new InetSocketAddress(
                                        "255.255.255.255",port
                                ))).sync();
                if(!ch.closeFuture().await(15000)){
                    System.out.println("查询超时!!!");
                }
            }
            finally {
                group.shutdownGracefully();
            }
        }
        public void messageReceived(ChannelHandlerContext channelHandlerContext,
                                       DatagramPacket datagramPacket) throws Exception {
            String response = datagramPacket.content().toString(CharsetUtil.UTF_8);
    
            if(response.startsWith("结果:")){
                System.out.println(response);
                channelHandlerContext.close();
            }
        }

    源码下载

    源码在src/main/java/Unp下,分为客户端和服务端,他们的代码基本和Netty入门章节的代码类似,只是减少了相关的解码器使用。

    GitHub地址:https://github.com/orange1438/Netty_Course

  • 相关阅读:
    js、css等文件引入空白问题
    Vue 组件 data为什么是函数
    安装Node,创建vue项目,运行及打包
    JQuery移除事件
    百度地图定位
    移动端导航过多,点击导航左右滚动回弹
    移动端开发模板
    移动端左右滑动导航
    使用‘圣杯布局’、‘双飞翼布局’来解释自适应的三栏水平布局
    css实现三角箭头
  • 原文地址:https://www.cnblogs.com/orange1438/p/5148850.html
Copyright © 2020-2023  润新知