Binary 有人举过用WebSocketClientProtocolHandler处理二进制websocket消息的例子吗?

Binary 有人举过用WebSocketClientProtocolHandler处理二进制websocket消息的例子吗?,binary,websocket,netty,Binary,Websocket,Netty,我无法通过客户端websocket发送二进制消息 我们有自己的消息对象和to/from二进制文件。因此,我创建了一个扩展ByteToMessageCodec的类。对channel.writeAndFlush(MyMessageInstance)的调用进入编码,在编码中获取字节[],并调用out.writeBytes(byteArray) 当我调用channel.writeAndFlush()时,它会进入/退出编码,但似乎永远不会在线路上进行编码 下面是通道管道初始化。MessageHandler

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

我们有自己的消息对象和to/from二进制文件。因此,我创建了一个扩展ByteToMessageCodec的类。对channel.writeAndFlush(MyMessageInstance)的调用进入编码,在编码中获取字节[],并调用out.writeBytes(byteArray)

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

下面是通道管道初始化。MessageHandler只是一个采用MessageType的SimpleInboundHAndler。请注意:我使用WebSocketClientProtocolHandler作为进行升级握手等操作的手段

提前感谢您的建议

上下快速移动
boolean handleCloseFrames=false;
WebSocketClientHandshaker handshaker=WebSocketClientHandshakerFactory.newHandshaker(serverUri,WebSocketVersion.V13,null,false,null);
最终WebSocketClientProtocolHandler wsHandler=新的WebSocketClientProtocolHandler(握手器,handleCloseFrames);
this.getBootstrap().handler(新的ChannelInitializer())
{
@凌驾
public void initChannel(SocketChannel ch)引发异常
{
ChannelPipeline=通道管道();
addLast(“http编解码器”,新的HttpClientCodec());
pipeline.addLast(“聚合器”,新的HttpObjectAggregator(65536));
addLast(“ws-handler”,wsHandler);
addLast(“messagecodec”,new CustomMessageCodec());
addLast(“messageHandler”,messageHandler);
}
});
ChannelFuture future=this.getBootstrap().connect(serverUri.getHost(),serverUri.getPort());
channel=future.sync().channel();

尝试将此方法添加到ByteToMessageCodec:

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

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

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

需要注意的一点是
WebSocketFrameEncoder
只编码
WebSocketFrame
及其子类型

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


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

您是否可以共享扩展为teToMessageCodec
公共类ThingworxMessageCodec扩展为teToMessageCodec{Override protected void encode(ChannelHandlerContext ctx,MyMessage msg,ByteBuf out)的类抛出异常{byte[]rawMessage=msg.getBinaryMessage();out.writeBytes(rawMessage);}重写受保护的无效解码(ChannelHandlerContext ctx,ByteBuf in,List out)抛出异常{byte[]rawMessage=in.array();MyMessage decodedMessage=MyMessageFactory.fromBinary(rawMessage);out.add(decodedMessage);}
对于缺少格式表示歉意…感谢您的建议,但这对获取在线消息没有任何效果感谢信任-当我返回并再次查看管道中的现有处理程序正在执行的操作时,它点击了,我完全意识到您指出的:这是一条消息传递给另一条消息。
@Override
public boolean acceptOutboundMessage(Object msg) throws Exception {
    return msg instanceof MyMessage;
}