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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM