springboot+netty初体验
发布日期:2021-05-27 02:54:19 浏览次数:36 分类:精选文章

本文共 4267 字,大约阅读时间需要 14 分钟。

Netty 是一个高性能、响应式的网络应用框架,基于Java NIO,支持异步、事件驱动的开发。对于Spring Boot项目来说,与Netty的集成是一个非常实用的技能,它能够帮助开发者快速构建高性能网络应用。

依赖管理

在项目中集成Netty,可以通过以下依赖来实现:

io.netty
netty-all
4.1.58.Final

服务端实现

以下是一个典型的Netty服务端实现代码示例:

public class NettyServer {    private static final Logger logger = LoggerFactory.getLogger(NettyServer.class);    public void start(InetSocketAddress socketAddress) {        // 配置主线程组        EventLoopGroup bossGroup = new NioEventLoopGroup(1);        // 配置工作线程组        EventLoopGroup workGroup = new NioEventLoopGroup(200);        ServerBootstrap bootstrap = new ServerBootstrap()            .group(bossGroup, workGroup)            .channel(NioServerSocketChannel.class)            .childHandler(new ServerChannelInitializer())            .localAddress(socketAddress)            .option(ChannelOption.SO_BACKLOG, 1024)            .childOption(ChannelOption.SO_KEEPALIVE, true);        try {            ChannelFuture future = bootstrap.bind(socketAddress).sync();            logger.info("服务器已启动并在地址: {}监听", socketAddress);            future.channel().closeFuture().sync();        } catch (InterruptedException e) {            logger.error("启动Netty服务器时出现异常", e);            e.printStackTrace();        } finally {            bossGroup.shutdownGracefully();            workGroup.shutdownGracefully();        }    }
消息处理类
public class NettyServerHandler extends ChannelInboundHandlerAdapter {    private static final Logger logger = LoggerFactory.getLogger(NettyServerHandler.class);    @Override    public void channelRead(ChannelHandlerContext ctx, Object msg) {        logger.debug("服务端接收到了消息: {}", msg);        ctx.write("你好啊ipelines!");        ctx.flush();    }    @Override    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {        logger.error("服务端连接异常", cause);        cause.printStackTrace();        ctx.close();    }}
初始化器
public class ServerChannelInitializer extends ChannelInitializer {    @Override    protected void initChannel(SocketChannel ch) {        ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));        ch.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));        ch.pipeline().addLast(new NettyServerHandler());    }}

客户端实现

以下是一个简单的Netty客户端实现代码示例:

public class NettyClient {    private static final Logger logger = LoggerFactory.getLogger(NettyClient.class);    public void start() {        EventLoopGroup group = new NioEventLoopGroup();        Bootstrap bootstrap = new Bootstrap()            .group(group)            .option(ChannelOption.TCP_NODELAY, true)            .channel(NioSocketChannel.class)            .handler(new ClientChannelInitializer());        try {            ChannelFuture future = bootstrap.connect("127.0.0.1", 8090).sync();            logger.info("客户端连接成功");                        // 发送消息            future.channel().writeAndFlush("你好啊服务器画魂!");                        // 等待连接关闭            future.channel().closeFuture().sync();        } catch (InterruptedException e) {            logger.error("Netty客户端启动异常", e);            e.printStackTrace();        } finally {            group.shutdownGracefully();        }    }
消息处理类
public class NettyClientHandler extends ChannelInboundHandlerAdapter {    private static final Logger logger = LoggerFactory.getLogger(NettyClientHandler.class);    @Override    public void channelRead(ChannelHandlerContext ctx, Object msg) {        logger.debug("客户端接收到了消息: {}", msg);    }    @Override    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {        logger.error("客户端连接异常", cause);        cause.printStackTrace();        ctx.close();    }}
初始化器
public class ClientChannelInitializer extends ChannelInitializer {    @Override    protected void initChannel(SocketChannel ch) {        ch.pipeline().addLast(new StringDecoder());        ch.pipeline().addLast(new StringEncoder());        ch.pipeline().addLast(new NettyClientHandler());    }}

运行知识

  • 服务端和客户端需要独立运行,即先启动服务端再启动客户端。
  • 服务端开始监听指定的端号,客户端则需要连接到相同的端号以建立连接。
  • Netty的事件循环机制使得网络通信处理更加高效,并能处理大量连接和数据。

日志输出示例

当服务端和客户端运行时,日志输出会如下:

服务端

服务器已启动并在地址: 127.0.0.1:8090监听服务端Channel active......

客户端

客户端连接成功客户端Channel Active .....客户端收到消息: 您好啊pipeline!

以上代码和描述提供了一个完整的Netty+Spring Boot示例,其中涵盖了服务端和客户端的实现细节,力求简洁明了,同时注重技术细节的展示。

上一篇:springboot+dubbo初尝试
下一篇:springboot+mqtt初体验

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月24日 20时20分44秒