クライアント 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();