Ist es möglich, Binärdaten mit STOMP über WebSockets mit Spring-WebSockets zu senden?

8

Ich bin in der Lage JSON mit STOMP über WebSockets folgenden zu senden und empfangen Frühjahrsdokumentation . Allerdings ist die Leistung bei hohen Raten sehr schlecht, daher möchte ich die Verwendung von binären Nachrichten profilieren.

  • Spring-WebSockets 4.0
  • JavaScript-Client, der in Chrome 35
  • ausgeführt wird
  • stomp.js 1.7.1

Senden

I-Nachrichten senden mit SimpMessageTemplate mit der notwendigen Broker Relais - siehe Frühling Dokumentation

%Vor%

Empfangen

Ein JavaScript-Client empfängt Daten mit stomp.js den Standardmechanismus verwendet wird.

%Vor%

Nachrichten werden empfangen, aber als Strings, mit Konsolenausgabe wie folgt. Ich erwarte eine rohe Art, wie Arraybuffer

%Vor%

Dinge, die ich versucht habe

ich das T in STOMP steht für Text erkennen, aber der Frühling Dokumentation impliziert Binärmeldungen möglich sind zumindest mit einfachen WebSockets, auch die stomp specification gibt an

  

STOMP ist textbasiert, erlaubt aber auch die Übertragung von Binärdateien   Nachrichten.

  • Debugging des sendenden Codes, und es scheint so lange wie byte [] zu bleiben, soweit ich
  • sehen kann
  • Debuggen der stomp.js-Bibliothek beim Empfangen Die Nachricht scheint eine Zeichenfolge zu sein, wenn sie im zugrunde liegenden ws.onmessage-Callback empfangen wird (Zeile 243 in stomp-1.7.1.js)
  • Viel Suchen - das scheint ein seltenes Thema mit wenig Information zu sein
  • Blick auf den Quellcode von stomp.js. Der einzige Verweis auf binary ist ws.binaryType="arraybuffer".

Update: Ich habe auf der Serverseite mehr Debugging durchgeführt. Es scheint, dass org.springframework.web.socket.TextMessage immer innerhalb von org.springframework.web.socket.messaging.StompSubProtocolHandler statt org.springframework.web.socket.BinaryMessage. Ich habe eine Feature-Anforderung für dieses SPR-12301

erstellt %Vor%

Meine Frage

  • Ist dieser Ansatz mit dieser Mischung von Technologien möglich?
  • Vermisse ich einen entscheidenden Schritt?
  • Kann mich jemand auf ein funktionierendes Beispiel hinweisen?
Adam 06.10.2014, 09:55
quelle

2 Antworten

9

Es scheint, dass org.springframework.web.socket.TextMessage immer in org.springframework.web.socket.messaging.StompSubProtocolHandler und nicht in org.springframework.web.socket.BinaryMessage verwendet wird. Ich habe eine Feature-Anforderung für dieses SPR-12301 erstellt, das akzeptiert wurde.

%Vor%

Aktualisieren

  • SPR-12301 wurde in 4.1.2 bereitgestellt, bietet aber nur Unterstützung für den Empfang von Binärnachrichten
  • Raised SPR-12475 zum Senden von Binärnachrichten
Adam 03.11.2014, 07:42
quelle
1

Versuchen Sie, Ihren Server nur mit ByteArrayMessageConverter :

zu konfigurieren %Vor%

AKTUALISIEREN

Ah! Ich sehe das. Danke:

%Vor%

Von anderer Seite aus STOMP spec:

  

Der Text einer STOMP-Nachricht muss ein String sein. Wenn Sie JSON-Objekte senden und empfangen möchten, ...

Nach dem ArrayBuffer :

  

Abrufen eines Array-Puffers aus vorhandenen Daten

     
  • Von einer Base64-Zeichenfolge
  •   
  • Von einer lokalen Datei
  •   

Also, ich denke, Sie haben kein chioce, anstatt Ihnen eine benutzerdefinierte MessageConverter zur Verfügung zu stellen, die Ihre byte[] in Base64 String konvertiert und sendet.

Auf der JavaScript-Seite sollten Sie diese Zeichenfolge irgendwie zu ArrayBuffer dekodieren.

    
Artem Bilan 06.10.2014 10:18
quelle