以下是一个简单的UDP客户端和服务器的示例,使用Netty,每一步都有注释来解释代码的作用。这个示例将帮助你入门Netty的UDP编程。
UDP服务器示例
public class UDPClient {
/**
*UDP客户端
* @param serverHost
* @param serverPort
* @param msg
*/
private static void msg(String serverHost,int serverPort,String msg){
// 创建一个事件循环组
EventLoopGroup group = new NioEventLoopGroup();
try {
// 创建一个Bootstrap类用于引导和绑定UDP客户端
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioDatagramChannel.class)
.handler(new ChannelInitializer<NioDatagramChannel>() {
@Override
protected void initChannel(NioDatagramChannel ch) {
// 设置UDP消息的处理程序
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new StringEncoder());
pipeline.addLast(new MessageToMessageEncoder<String>() {
@Override
protected void encode(ChannelHandlerContext ctx, String msg, List<Object> out) {
// 编码要发送的UDP数据包
out.add(new DatagramPacket(ctx.alloc().buffer().writeBytes(msg.getBytes(StandardCharsets.UTF_8)), new InetSocketAddress(serverHost, serverPort)));
}
});
}
});
// 绑定UDP客户端到随机端口
ChannelFuture f = b.bind(0).sync();
Channel channel = f.channel();
// 发送UDP消息
channel.writeAndFlush(msg);
// 等待通道关闭
channel.closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭事件循环组
group.shutdownGracefully();
}
}
}
UDP服务器处理程序示例:
/**
* UDP服务器处理程序
*/
public class UDPServerHandler extends SimpleChannelInboundHandler<String> {
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
// 在此处处理接收到的UDP消息
System.out.println("Received: " + msg);
}
}
UDP客户端示例
public class UDPServer {
/**
* UDP服务器
* @param inetPort 端口
*/
private static void start(Integer inetPort){
// 创建一个事件循环组,通常一个用于处理数据读取,另一个用于处理数据写入
EventLoopGroup group = new NioEventLoopGroup();
try {
// 创建一个Bootstrap类用于引导和绑定UDP服务器
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioDatagramChannel.class)
.handler(new ChannelInitializer<NioDatagramChannel>() {
@Override
protected void initChannel(NioDatagramChannel ch) {
// 设置UDP消息的处理程序
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new MessageToMessageDecoder<DatagramPacket>() {
@Override
protected void decode(ChannelHandlerContext ctx, DatagramPacket packet, List<Object> out) {
// 解码接收的UDP数据包
out.add(packet.content().toString(StandardCharsets.UTF_8));
}
});
pipeline.addLast(new UDPServerHandler());
}
});
// 绑定UDP服务器到指定的端口
ChannelFuture f = b.bind(new InetSocketAddress(inetPort)).sync();
f.channel().closeFuture().await();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭事件循环组
group.shutdownGracefully();
}
}
}