UdpServer
package org.zln.netty.five.part07; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioDatagramChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created by sherry on 16/11/7. */ public class UdpServer { /** * 日志 */ private Logger logger = LoggerFactory.getLogger(UdpServer.class); public void run(int port){ EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(eventLoopGroup) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST,true) .handler(new UdpServerHandler()); bootstrap.bind(port).sync().channel().closeFuture().await(); } catch (InterruptedException e) { logger.error(e.getMessage(),e); }finally { eventLoopGroup.shutdownGracefully(); } } }
UdpServerHandler
package org.zln.netty.five.part07; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import io.netty.util.CharsetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.ThreadLocalRandom; /** * Created by sherry on 16/11/7. */ public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> { private static final String[] DICT = { "只要功夫深,鐵杵磨成針" , "舊時王謝堂前燕,飛入尋常百姓家" , "洛陽親友如相問,一片冰心在玉壺" , "一寸光陰一寸金,寸金難買寸光陰" , "老驥伏櫪,志在千里.烈士暮年,壯心不已!" }; /** * 日志 */ private Logger logger = LoggerFactory.getLogger(UdpServerHandler.class); @Override protected void messageReceived(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { String req = msg.content().toString(CharsetUtil.UTF_8); logger.debug("收到的請求:" + req); if ("諺語字典查詢?".equals(req)) { ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("諺語查詢結果:" + nextQueue(), CharsetUtil.UTF_8), msg.sender())); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close(); logger.error(cause.getMessage(),cause); } private String nextQueue() { //ThreadLocalRandom 線程安全隨機類 int quoteId = ThreadLocalRandom.current().nextInt(DICT.length); return DICT[quoteId]; } }
UdpClient
package org.zln.netty.five.part07; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.DatagramPacket; import io.netty.channel.socket.nio.NioDatagramChannel; import io.netty.util.CharsetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetSocketAddress; /** * Created by sherry on 16/11/7. */ public class UdpClient { /** * 日志 */ private Logger logger = LoggerFactory.getLogger(UdpClient.class); public void run(int port) { EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(eventLoopGroup) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST, true) .handler(new UdpClientHandler()); Channel channel = bootstrap.bind(0).sync().channel(); //向網段內的所有機器廣播 channel.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("諺語字典查詢?", CharsetUtil.UTF_8), new InetSocketAddress("255.255.255.255", port))).sync(); if (!channel.closeFuture().await(15000)) { logger.debug("查詢超時"); } } catch (InterruptedException e) { logger.error(e.getMessage(), e); } finally { eventLoopGroup.shutdownGracefully(); } } }
UdpClientHandler
package org.zln.netty.five.part07; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import io.netty.util.CharsetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created by sherry on 16/11/7. */ public class UdpClientHandler extends SimpleChannelInboundHandler<DatagramPacket> { /** * 日志 */ private Logger logger = LoggerFactory.getLogger(UdpClientHandler.class); @Override protected void messageReceived(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception { String resp = msg.content().toString(CharsetUtil.UTF_8); if (resp.startsWith("諺語查詢結果:")){ logger.debug(resp); ctx.close(); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable e) throws Exception { logger.error(e.getMessage(),e); ctx.close(); } }