有没有人有任何使用WebSocketClientProtocolHandler和二进制websocket消息的例子?

时间:2013-11-07 12:13:58

标签: binary websocket netty

我在客户端websocket上发送二进制消息时遇到问题。

我们有自己的消息对象以及来自二进制文件。所以我创建了一个扩展ByteToMessageCodec的类。对channel.writeAndFlush(MyMessageInstance)的调用进入编码,获取byte []并调用out.writeBytes(byteArray)。

当我调用channel.writeAndFlush()时 - 它进入/退出编码,但它似乎永远不会在线上进行。

以下是通道管道初始化。 MessageHandler只是一个接收MessageType的SimpleInboundhandler。请注意:我使用WebSocketClientProtocolHandler作为进行升级握手的方法等。

提前感谢任何建议,

鲍勃

boolean handleCloseFrames = false;
WebSocketClientHandshaker handshaker = WebSocketClientHandshakerFactory.newHandshaker(serverUri, WebSocketVersion.V13, null, false, null);

final WebSocketClientProtocolHandler wsHandler = new WebSocketClientProtocolHandler(handshaker, handleCloseFrames);

    this.getBootstrap().handler(new ChannelInitializer<SocketChannel>() 
    {
        @Override
        public void initChannel(SocketChannel ch) throws Exception 
        {
            ChannelPipeline pipeline = ch.pipeline();
            pipeline.addLast("http-codec", new HttpClientCodec());
            pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
            pipeline.addLast("ws-handler", wsHandler);
            pipeline.addLast("message-codec", new CustomMessageCodec());
            pipeline.addLast("message-handler", messageHandler);
        }
    });

    ChannelFuture future = this.getBootstrap().connect(serverUri.getHost(), serverUri.getPort());
    channel = future.sync().channel();

2 个答案:

答案 0 :(得分:1)

ByteToMessageCodec(和MessageToByteEncoder)用于将自定义对象转换为ByteBuf

WebSocketClientHandshaker会将WebSocketFrameEncoder添加到管道中,以便您可以在握手完成后发送WebSocketFrame

需要注意的一点是,WebSocketFrameEncoder仅对WebSocketFrame及其子类型进行编码。

因此,ByteToMessageCodec编码的任何内容都不会由WebSocketFrameEncoder处理,您的服务器可能无法理解您发送的内容。

要解决此问题,您必须使用MessageToMessageCodec代替ByteToMessageCodec,并将邮件编码为BinaryWebSocketFrame并将BinaryWebSocketFrame解码为您的邮件。

答案 1 :(得分:0)

尝试将此方法添加到ByteToMessageCodec:

@Override
public boolean acceptOutboundMessage(Object msg) throws Exception {
    return msg instanceof MyMessage;
}