• springboot如何接入netty,实现在线统计人数?


    springboot如何接入netty,实现在线统计人数?

    Netty 是 一个异步事件驱动的网络应用程序框架 ,用于快速开发可维护的高性能协议服务器和客户端。 Netty ​ 是一个 NIO 客户端服务器框架 ​,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。

    快速和简单” 并不意味着生成的应用程序会受到可维护性或性能问题的影响。Netty 是经过精心设计的,它借鉴了许多协议(如 FTP、SMTP、HTTP 以及各种基于二进制和基于文本的遗留协议)的实现经验。因此,Netty 成功地找到了一种方法,可以在不妥协的情况下实现​ 易于开发、性能、稳定性和灵活性。

    在这里插入图片描述

    要在 Spring Boot 中接入 Netty 并实现在线统计人数的功能,可以按照以下步骤进行操作:

    1. 添加依赖:在 pom.xml 文件中添加 Netty 的相关依赖。可以根据需要选择合适的版本,例如:
    <dependency>
        <groupId>io.nettygroupId>
        <artifactId>netty-allartifactId>
        <version>4.1.68.Finalversion>
    dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 创建 Netty 服务器:创建一个类来启动并配置 Netty 服务器,例如 NettyServer
    import io.netty.bootstrap.ServerBootstrap;
    import io.netty.channel.ChannelFuture;
    import io.netty.channel.ChannelInitializer;
    import io.netty.channel.EventLoopGroup;
    import io.netty.channel.nio.NioEventLoopGroup;
    import io.netty.channel.socket.SocketChannel;
    import io.netty.channel.socket.nio.NioServerSocketChannel;
    
    public class NettyServer {
    
        private final int port;
        
        public NettyServer(int port) {
            this.port = port;
        }
        
        public void run() throws Exception {
            EventLoopGroup bossGroup = new NioEventLoopGroup();
            EventLoopGroup workerGroup = new NioEventLoopGroup();
            
            try {
                ServerBootstrap b = new ServerBootstrap();
                b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) throws Exception {
                            ch.pipeline().addLast(new YourChannelHandler());
                        }
                    });
    
                ChannelFuture f = b.bind(port).sync();
                f.channel().closeFuture().sync();
            } finally {
                workerGroup.shutdownGracefully();
                bossGroup.shutdownGracefully();
            }
        }
    
        public static void main(String[] args) throws Exception {
            int port = 8888; // 配置服务器端口号
            new NettyServer(port).run(); // 启动服务器
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    1. 实现自定义的 ChannelHandler:你需要编写一个继承自 SimpleChannelInboundHandler 的自定义 ChannelHandler,用于处理接收到的数据。
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.channel.SimpleChannelInboundHandler;
    
    public class YourChannelHandler extends SimpleChannelInboundHandler<String> {
        
        // 维护在线人数的变量
        private static AtomicInteger onlineCount = new AtomicInteger(0);
        
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            onlineCount.incrementAndGet(); // 新的连接上线,增加在线人数
        }
        
        @Override
        public void channelInactive(ChannelHandlerContext ctx) throws Exception {
            onlineCount.decrementAndGet(); // 连接下线,减少在线人数
        }
    
        @Override
        protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
            // 处理接收到的消息
            // ...
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    YourChannelHandler 中,通过使用 AtomicInteger 变量来维护在线人数,并在 channelActive()channelInactive() 方法中,分别在新连接建立和连接断开时更新在线人数。

    1. 在 Spring Boot 中启动 Netty 服务器:在 Spring Boot 应用的入口类中,添加启动 Netty 服务器的代码。
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class YourApplication {
    
        public static void main(String[] args) throws Exception {
            int nettyPort = 8888; // 配置 Netty 服务器端口号
            new NettyServer(nettyPort).run(); // 启动 Netty 服务器
            
            SpringApplication.run(YourApplication.class, args); // 启动 Spring Boot 应用
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 在 Spring Boot 中使用在线人数:你可以在 Spring Boot 的其他组件中使用在线人数。例如,你可以创建一个 RESTful 接口来获取在线人数。
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class OnlineUserController {
        
        @GetMapping("/online-count")
        public int getOnlineCount() {
            return YourChannelHandler.onlineCount.get(); // 获取在线人数
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    Mysql主从复制之binlog_group_commit_sync_delay
    TNZ5TSC OSN1800V全新板卡100G支路业务处理板
    【Linux】常用文件管理命令
    4721. 排队
    MySQL MHA高可用切换
    leetCode 53.最大子数和 图解 + 贪心算法/动态规划+优化
    踩准AI时代风口,NFPrompt让人人都能成为赚取利润的创作者
    拖拽式表单开源表单设计器的特点是什么?
    python数据分析—删除value=0的行
    【JavsSE】数组的定义与使用
  • 原文地址:https://blog.csdn.net/weixin_44427181/article/details/133267976