关于UDP的介绍,这里不在阐述。
相比于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();
}
finally {
group.shutdownGracefully();
}
}
@Override
public void messageReceived(ChannelHandlerContext channelHandlerContext,
DatagramPacket datagramPacket) throws Exception {
// 因为Netty对UDP进行了封装,所以接收到的是DatagramPacket对象。
String req = datagramPacket.content().toString(CharsetUtil.UTF_8);
System.out.println(req); if("啪啪啪来拉!!!".equals(req)){
channelHandlerContext.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(
"结果:",CharsetUtil.UTF_8),datagramPacket.sender()));
}
}
客户端:
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入门章节的代码类似,只是减少了相关的解码器使用。