Netty中的UDP入门

101 阅读1分钟

以下是一个简单的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();
        }
    }

}