0

我无法通过客户端 websocket 发送二进制消息。

我们有自己的消息对象以及 to/from 二进制文件。所以我创建了一个扩展 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();
4

2 回答 2

2

ByteToMessageCodec(and MessageToByteEncoder) 旨在将自定义对象转换为ByteBuf.

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

需要注意的一件事是WebSocketFrameEncoder仅编码WebSocketFrame及其子类型。

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

要解决此问题,您必须使用MessageToMessageCodec而不是ByteToMessageCodec,并将您的消息编码为BinaryWebSocketFrame并将 a 解码BinaryWebSocketFrame为您的消息。

于 2013-11-08T03:00:49.467 回答
0

尝试将此方法添加到 ByteToMessageCodec:

@Override
public boolean acceptOutboundMessage(Object msg) throws Exception {
    return msg instanceof MyMessage;
}
于 2013-11-07T17:03:05.693 回答