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

posted @ 2016-01-21 16:52  橙&子  阅读(24693)  评论(1编辑  收藏  举报