当前位置: 首页 > 知识库问答 >
问题:

netty SimpleChannelInboundHandler消息最多只能接收16384条

慕乐池
2023-03-14

我已经用http://netty.io/wiki/user-guide-for-4.x.html链接但我得到的数据最多只有16384字节。

public class DiscardServerHandler extends ChannelInboundHandlerAdapter 
{   
    byte bNullArray[] = "".getBytes();
    String strFullData= new String(bNullArray,StandardCharsets.UTF_8);        
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception  
    { 
        try 
        {
           String MsgRead;
           ByteBuf in = (ByteBuf) msg;
           MsgRead=in.toString(io.netty.util.CharsetUtil.UTF_8);
           // here I get data only upto 1024 and this method get called 16 times.
           // So total data received is == 1024*16 = 16384        
           strFullData = strFullData + MsgRead;    
        } 
        finally 
        {
            ReferenceCountUtil.release(msg);
        }
    }    
    @Override 
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception 
    { 
        //WriteMyLog(strFullData);      
        //Here size of strFullData is 16384        
        strFullData = ProcessMyData(strFullData);       
        byte[] respByteBuf = strFullData.getBytes();                   
        ByteBuf Resp1 = ctx.alloc().buffer(respByteBuf.length);    
        Resp1.writeBytes(respByteBuf);                
        ctx.write(Resp1);            
        ctx.flush(); 
        ctx.close(); 
    }
}

如何获取更多数据?

共有1个答案

韦泳
2023-03-14

当你的操作系统从套接字读取一些数据时,它会将其传递给用户空间(Java在你的情况下是netty)。16*1024是你的操作系统从套接字读取并传递给你的缓冲区大小。这意味着如果您的消息超过此大小,ChannelInundHandlerAdapter处理程序不适合您的情况。您需要使用ByteToMessageDecoder。类似于:

public class MyBigMessageDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { 
        if (in.readableBytes() < MY_BIG_MESSAGE_SIZE) {
            return; 
        }

        out.add(in.readBytes(MY_BIG_MESSAGE_SIZE));
    }
}

Netty还为不同的场景提供了一系列现成的处理程序,比如LineBasedFrameDecoderLengthFieldBasedFrameDecoderFixedLengthFrameDecoder,等等。我相信你可以使用其中的一些。

一般来说,它们都做相同的事情——继续读取收入字节,直到满足某些条件。当准备就绪时,它们会进一步传递读取字节。

 类似资料:
  • 在使用SocketIO的时候,消息将被作为活动(event)的两端接收。在客户端使用JavaScript回叫信号。使用Flask-SocketIO服务器,需要为这些活动注册处理器(handler),类似于视图函数怎样处理路由。 下面的例子是为一个未命名的活动创建了一个服务端的活动处理器(event handler): @socketio.on('message') def handle_mess

  • 26.4 接收消息 26.4.1 同步接收 虽然 JMS 通常与异步处理相关,但它也可以同步地消费消息。可重载的receive(..)方法提供了这个功能。在同步接收期间,调用线程阻塞,直到接收到消息。这可能是一个危险的操作,因为调用线程可能无限期地被阻塞。receiveTimeout属性指定了接收者等待消息的超时时间。 26.4.2 异步接收 - 消息驱动的 POJOs Spring 还可以通过使

  • 20.4. 接收消息 20.4.1. 同步接收 虽然JMS一般都和异步处理相关,但它也可以同步的方式使用消息。可重载的receive(..)方法提供了这种功能。在同步接收中,接收线程被阻塞直至获得一个消息,有可能出现线程被无限阻塞的危险情况。属性receiveTimeout指定了接收器可等待消息的延时时间。 20.4.2. 异步接收 - 消息驱动的POJOs 类似于EJB世界里流行的消息驱动bea

  • 当监听设备后,会返回接收到的消息数据。 请求方式: 无 返回值: "|4|2|5|message|" 返回接收到的消息 参数 message 返回的消息内容

  • 本文向大家介绍解释Kafka可以接收的消息最大为多少?相关面试题,主要包含被问及解释Kafka可以接收的消息最大为多少?时的应答技巧和注意事项,需要的朋友参考一下 答:Kafka可以接收的最大消息大小约为1000000字节。

  • 概述 为了能够让轻应用订阅号的开发者接收到用户在消息窗口的留言消息,开发者可以在管理后台设置消息服务器并开启接收用户对话消息模式。 设置消息服务器时接需要提供可用的接收消息的回调URL地址,为了让通信更加安全,建议使用https。 设置成功并开启了接收对话消息模式后,用户在轻应用或订阅号窗口里发送的消息会推送给设置的URL,服务器接收到消息后,可以通过异步发送消息接口给用户回复消息。 设置消息服务