这里需要netty的jar包文件,我已经上传到百度云,提供下载:
这里使用的是netty5
http://pan.baidu.com/s/1hr2VBzY
服务端:
package com.use.socket.udp.Server;
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; public class UdpServer { // 相比于TCP而言,UDP不存在客户端和服务端的实际链接,因此 // 不需要为连接(ChannelPipeline)设置handler 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 UdpServerHandler()); b.bind(port).sync().channel().closeFuture().await(); System.out.println("启动成功"); } finally { group.shutdownGracefully(); } } public static void main(String[] args) throws Exception{ int port = 8080; if(args.length>0){ try{ port = Integer.parseInt(args[0]); } catch (NumberFormatException e){ e.printStackTrace(); } } new UdpServer().run(port); }}
package com.use.socket.udp.Server; 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 io.netty.util.internal.ThreadLocalRandom; public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket>{ private static final String[] DICTIONARY={ "hello world", "C++", "C#", "Java", "python" }; private String nextQuoto(){ // 线程安全的随机类:ThreadLocalRandom int quoteId = ThreadLocalRandom.current().nextInt(DICTIONARY.length); return DICTIONARY[quoteId]; } @Override public void messageReceived(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) throws Exception { // 因为Netty对UDP进行了封装,所以接收到的是DatagramPacket对象。 String req = datagramPacket.content().toString(CharsetUtil.UTF_8); System.out.println("udp service收到"+req); /* if("aaa".equals(req)){ channelHandlerContext.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer( "resourlt:"+nextQuoto(),CharsetUtil.UTF_8),datagramPacket.sender())); }else{ channelHandlerContext.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer( "resourlt:"+nextQuoto(),CharsetUtil.UTF_8),datagramPacket.sender())); }*/ } @Override public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause)throws Exception{ ctx.close(); cause.printStackTrace(); } }
可以使用工具测试:
查看eclipse中udp服务端数据:
可以接收到,自此,netty的udp服务端执行完毕
