我在客户端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();
答案 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;
}