标签:
关于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
标签:
原文地址:http://www.cnblogs.com/orange1438/p/5148850.html