14

spring documentationに従って、STOMP over WebSockets を使用して JSON を送受信できます。ただし、大量の高レートではパフォーマンスが低下するため、バイナリ メッセージの使用をプロファイルしたいと思います。

  • Spring-WebSockets 4.0
  • Chrome 35 で実行されている JavaScript クライアント
  • ストンプ.js 1.7.1

送信

必要なブローカーリレーで SimpMessageTemplate を使用してメッセージを送信します-春のドキュメントを参照してください

@Controller
public class DemoBinaryController {
   @Autowired
   private SimpMessagingtemplate template

   @Scheduled(fixedDelay = 5000)
   public void demo() throws Exception {
      GenericMessage<byte[]> message = new GenericMessage<byte[]>(new byte[]{65,66,67});
      template.send("/app/binarydemo", message);
   }
}

受信

JavaScript クライアントは、標準のメカニズムを使用して、stomp.jsを使用してデータを受信します。

var subscription = client.subscribe("/app/binarydemo", new function(message) {
   console.log("RX message", typeof message.body, message.body.length);
});

メッセージは文字列として受信され、コンソール出力は次のようになります。ArrayBufferのような生の型を期待しています

RX message string  3
RX message string  3

私が試したこと

STOMP の T は Text を表していることは理解していますが、Spring のドキュメントでは、少なくともプレーンな WebSocket でバイナリ メッセージが可能であることを示唆しています

STOMP はテキスト ベースですが、バイナリ メッセージの送信も可能です。

  • 送信コードをデバッグすると、見る限りバイト [] のままのようです
  • 受信中の stomp.js ライブラリのデバッグ。基礎となる ws.onmessage コールバックで受信すると、メッセージは文字列のように見えます (stomp-1.7.1.js の 243 行目)。
  • たくさんの検索 - これはほとんど情報がない珍しいトピックのようです
  • stomp.js のソース コードを見てみます。バイナリへの唯一の参照は ws.binaryType = "arraybuffer" です。

更新: サーバー側でさらにデバッグを行いました。org.springframework.web.socket.TextMessage は、 org.springframework.web.socket.BinaryMessageではなく、常に org.springframework.web.socket.messaging.StompSubProtocolHandler 内で使用されるようです。このSPR-12301の機能リクエストを提出しました

message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headers).build();
byte[] bytes = this.stompEncoder.encode((Message<byte[]>) message);

synchronized(session) {
    session.sendMessage(new TextMessage(new String(bytes, UTF8_CHARSET)));
}

私の質問

  • このアプローチは、このテクノロジーの組み合わせで可能ですか?
  • 私はいくつかの重要なステップを逃していますか?
  • 誰でも実際の例を教えてもらえますか
4

2 に答える 2

2

だけでサーバーを構成してみてくださいByteArrayMessageConverter

@Configuration
@EnableWebSocketMessageBroker
public class MyWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
   
   @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        messageConverters.add(new ByteArrayMessageConverter());
        return false;
    }

}

アップデート

ああ!私はそれを見る。ありがとう:

public TextMessage(byte[] payload) {
    super(new String(payload, UTF_8));
    this.bytes = payload;
}

STOMP仕様の反対側から:

STOMP メッセージの本文は文字列でなければなりません。JSONオブジェクトを送受信したい場合…

によるとArrayBuffer

既存のデータから配列バッファを取得する

  • Base64 文字列から
  • ローカルファイルから

したがって、カスタムを提供するのではなく、chioce を持っていないと思います。これにより、Base64 文字列にMessageConverter変換されて送信されます。byte[]

JavaScript 側では、その文字列をArrayBuffer何らかの方法でデコードする必要があります。

于 2014-10-06T10:18:38.397 に答える