Netty(六)UDP在netty中的使用

關於UDP的介紹,這裏不在闡述。
相比於TCP而言,UDP不存在客戶端和服務端的實際連接,所以不須要爲鏈接(ChannelPipeline)設置handler。java

 

服務端:git

 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     }

 

客戶端:github

    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入門章節的代碼相似,只是減小了相關的解碼器使用。ide

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

相關文章
相關標籤/搜索