關於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