Java 使用netty的WebSocketFrameAggregator收集websocket二进制消息块

Java 使用netty的WebSocketFrameAggregator收集websocket二进制消息块,java,websocket,netty,Java,Websocket,Netty,我正在尝试从服务器接收websocket二进制消息块,并使用第二个nettyChannelPipeline配置将它们收集在一起: class BootstrapFactory { public static final int MAX_FRAME_LENGTH = 8192; public static final int TEN_MB = 10 * 1048576 ; Bootstrap createBootstrap(final URI uri, final ChannelHandler

我正在尝试从服务器接收websocket二进制消息块,并使用第二个nettyChannelPipeline配置将它们收集在一起:

class BootstrapFactory {
public static final int MAX_FRAME_LENGTH = 8192;
public static final int TEN_MB = 10 * 1048576 ;

Bootstrap createBootstrap(final URI uri, final ChannelHandler handler) {
    return createBootstrap(uri, handler, null);
}

Bootstrap createBootstrap(final URI uri, final ChannelHandler handler, final SslHandler sslHandler) {
    final WebSocketClientHandshaker handshaker = WebSocketClientHandshakerFactory.newHandshaker(uri, WebSocketVersion.V13, null, false, new DefaultHttpHeaders());
    final WebSocketClientProtocolHandler wsHandler = new WebSocketClientProtocolHandler(handshaker);

    Bootstrap bootstrap = new Bootstrap()
            .group(new NioEventLoopGroup())
            .channel(NioSocketChannel.class)
            .handler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) {
                    ChannelPipeline pipeline = ch.pipeline();
                    if (sslHandler != null) {
                        pipeline.addFirst(sslHandler);
                    }
                    pipeline.addLast(
                            new HttpClientCodec(),
                            new HttpObjectAggregator(MAX_FRAME_LENGTH),
                            wsHandler,
                            new WebSocketFrameAggregator(TEN_MB),
                            handler);
                }
            });
    return bootstrap;
}
}
类BootstrapFactory{
公共静态最终整数最大帧长度=8192;
公共静态最终整数10_MB=10*1048576;
引导createBootstrap(最终URI、最终ChannelHandler处理程序){
返回createBootstrap(uri,处理程序,null);
}
引导createBootstrap(最终URI、最终ChannelHandler处理程序、最终SslHandler SslHandler){
final WebSocketClientHandshaker handshaker=WebSocketClientHandshakerFactory.newHandshaker(uri,WebSocketVersion.V13,null,false,new DefaultHttpHeaders());
最终WebSocketClientProtocolHandler wsHandler=新的WebSocketClientProtocolHandler(握手器);
Bootstrap Bootstrap=new Bootstrap()
.group(新的NioEventLoopGroup())
.channel(NioSocketChannel.class)
.handler(新的通道初始值设定项(){
@凌驾
受保护信道(SocketChannel ch){
ChannelPipeline=通道管道();
if(sslHandler!=null){
pipeline.addFirst(sslHandler);
}
pipeline.addLast(
新的HttpClientCodec(),
新的HttpObjectAggregator(最大帧长度),
wsHandler,
新的WebSocketFrameAggregator(10MB),
经办人);
}
});
返回引导;
}
}
因此,我得到的消息大小有限,最大为8192字节。有趣的是,当消息来自大小超过8192字节(例如13786字节)的服务器时,WebSocketFrameAggregator返回大小为5594字节的消息,这会导致部分数据丢失

这里可能需要一些额外的配置?我需要帮助。谢谢


我使用的是netty all 4.1.0.Beta3-由于某些原因,我无法将其更改为其他版本。

我无法使用嵌入式通道再现此问题,您能否发布一篇包含此问题的文章?您正在测试的帧大小小于默认限制65kB(至少在4.1.1中,我不确定是否为4.1.0)。我有这个问题,框架大小超过100kB。解决方案包括两个步骤:-添加WebSocketFrameAggregator-更改缓冲区限制(这是创建握手器时的附加参数)