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(およびMessageToByteEncoder) は、カスタム オブジェクトを に変換するためのものByteBufです。

WebSocketClientHandshakerハンドシェイクが終了WebSocketFrameEncoderしたら送信できるように、パイプラインに追加されます。WebSocketFrame

注意すべきことの 1 つは、WebSocketFrameEncoderエンコードのみWebSocketFrameとそのサブタイプです。

したがって、あなたによってエンコードされたものByteToMessageCodecはまったく処理さWebSocketFrameEncoderれず、サーバーはおそらくあなたが送信したものを理解できません.

この問題を解決するには、MessageToMessageCodec代わりにを使用ByteToMessageCodecし、メッセージを にエンコードしてメッセージにBinaryWebSocketFrameデコードする必要があり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 に答える