使用来自netty

时间:2016-01-20 10:53:58

标签: java websocket netty

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

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;
}
}

结果我收到了有限大小的消息 - 最多8192个字节。有趣的是,当消息来自大小超过8192字节的服务器时,例如。 13786字节,结果是WebSocketFrameAggregator返回大小为5594字节的消息,导致丢失部分数据。

这里可能需要一些额外的配置吗?需要帮忙。感谢。

我正在使用netty-all 4.1.0.Beta3 - 由于某种原因我无法将其更改为不同的版本。

0 个答案:

没有答案