netty5 长联接问题 400 请求报错  -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

netty5 长联接问题 400 请求报错 

kun坤 2020-05-28 16:09:04 31

我在使用netty5做通讯框架,长联接。连续发送多个请求,服务端每个请求后也执行 ctx.writeAndFlush(buildResponse(message, body));服务端居然将几个请求处理完了后。端户端才会有反应。哪位能帮解决一下,实现writeAndFlush后客户端能立即收到响应。
Server
ServerBootstrap b = new ServerBootstrap();             b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 1024).handler(new LoggingHandler(LogLevel.INFO)).childHandler(new ChildChannelHandler());             f = b.bind(port).sync();             System.out.println("Netty Server start ok:" + (NettyConstant.REMOTEIP + ":" + port));             f.channel().closeFuture().sync();

client
  Bootstrap b = new Bootstrap();             //            b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true).handler(new ChannelInitializer<SocketChannel>() {             b.group(group).channel(NioSocketChannel.class).option(ChannelOption.ALLOCATOR, UnpooledByteBufAllocator.DEFAULT)                     .handler(new ChannelInitializer<SocketChannel>() {                         @Override                         protected void initChannel(SocketChannel c) throws Exception {                             // -8表示lengthAdjustment,让解码器从0开始截取字节,并且包含消息头                               c.pipeline().addLast(new NettyMessageDecoder(Integer.MAX_VALUE, 4, 4, -8, 0));                             c.pipeline().addLast(new NettyMessageEncoder());                             c.pipeline().addLast(new LoggingHandler(LogLevel.INFO));                             //                    c.pipeline().addLast("readTimeoutHandler", new ReadTimeoutHandler(50));                             c.pipeline().addLast("LoginAuthHandler", new LoginAuthReqHandler());                             c.pipeline().addLast(new InitHandler());                             c.pipeline().addLast(new ClientHandler());                         }                     });             //此外可以发送多个目标地址             ChannelFuture f = b.connect(host, port).sync();             System.out.println("Netty time Client connected at port " + port);             f.channel().closeFuture().sync();

分享到
取消 提交回答
全部回答(1)
  • kun坤
    2020-05-29 11:47:58

    好先进啊,我们都4######应该是发生粘包了吧######参考netty权威指南上写的。非常感谢两位.不过已经解决了。在后台加了一个newSingleThreadExecutor就可以立刻返回数据。而不会拼在一块了。 ######

    引用来自“毛毛侯”的评论

    参考netty权威指南上写的。非常感谢两位.不过已经解决了。在后台加了一个newSingleThreadExecutor就可以立刻返回数据。而不会拼在一块了。

    你是说server端的childHandler吧?使用线程池去执行业务hander?

    0 0
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

推荐文章