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