SpringBoot整合Netty服务端在Tomcat运行实坑经历

本文记录了在SpringBoot中整合Netty服务端进行远程通讯的过程,遇到的长连接问题,以及版本冲突与Tomcat上的运行坑。通过调整Netty版本、解决依赖冲突,并采用线程池成功解决启动问题,最终实现服务稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot整合Netty

公司是做人工智能人脸识别技术落地的,上周确定要做设备的远程控制,android端推荐使用netty,如是坑开始了~~~

第1天
netty服务的代码网上已经烂大街了,在此不赘述,但是!!!
netty服务搭建后无法保持长连接,客户端发完消息就断开连接

……

第1+n天
android大哥看不下去了
因为我用的netty4,遂推荐我使用5,本地测试没问题,整合至springBoot的时候出现版本冲突,无法解决(ps:最后发现项目用了redis,底层应该用了netty通讯),netty5卒

又回到4上,结果大哥的netty代码毫无问题,就给我用了,整合至本地没问题,废话不多说贴代码
server:

@Component
public class EchoServer implements onChannelOperation {
    @Value("${netty.port}")
    private  int port;
    private static final Logger log= LoggerFactory.getLogger(EchoServer.class);
    private EventLoopGroup bossGroup = new NioEventLoopGroup();
    private EventLoopGroup workerGroup = new NioEventLoopGroup();
    //public List<NettyServerHandler> socketList = new ArrayList();
    private static final ConcurrentHashMap<NettyServerHandler,SocketChannel> channelMap= new ConcurrentHashMap<>();
    
    public void run() {
     /*   EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于处理服务器端接收客户端连接
        EventLoopGroup workerGroup = new NioEventLoopGroup(); // 进行网络通信(读写)*/
        try {
            Thread t=Thread.currentThread();
           log.info("run() in EchoServer"+ Calendar.getInstance().getTime()+"___"+t.getName());
            ServerBootstrap bootstrap = new ServerBootstrap(); // 辅助工具类,用于服务器通道的一系列配置
            bootstrap.group(bossGroup, workerGroup) // 绑定两个线程组, 绑定线程池
                    .channel(NioServerSocketChannel.class) // 指定NIO的模式
                    .childHandler(new ChannelInitializer<SocketChannel>() { // 配置具体的数据处理方式
                        @Override // 这个方法里,连接一个客户端,进入一次,连接一个客户端进入一次
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            log.info("有客户端连接了:" + socketChannel);
                            // 设置超时时间,可选
                            // socketChannel.pipeline().addLast(new IdleStateHandler(READ_IDEL_TIME_OUT,
                            //  WRITE_IDEL_TIME_OUT, ALL_IDEL_TIME_OUT, TimeUnit.SECONDS));
                            NettyServerHandler scobj = new NettyServerHandler(EchoServer.this); //设置监听
                            socketChannel.pipeline().addLast(scobj);
                            //socketList.add(scobj);
                            channelMap.put(scobj,socketChannel);
                            log.info("socket通道数量:" + "--"+channelMap.size());
                        }
                    })
                  
                    .option(ChannelOption.SO_BACKLOG, 32 * 1024) // 设置TCP缓冲区
                    .option(ChannelOption.SO_SNDBUF, 64 * 1024) // 设置发送数据缓冲大小
                    .option(ChannelOption.SO_RCVBUF, 64 * 1024) // 设置接受数据缓冲大小
                    .childOption(ChannelOption.SO_KEEPALIVE, true); // true保持连接, false no
            //.childOption(ChannelOption.ALLOW_HALF_CLOSURE, true); // 允许半关闭socket即可。默认为false,客户端shutdownoutput时,SocketChannel.read(..)
            ChannelFuture future = bootstrap.bind(port).sync();
           log.info("服务器启动成功,监听端口号:" + port);
            future.channel().closeFuture().sync();// 关闭服务器通道
        } catch (Exception e) {
            e.p
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值