2016-03-22 73 views
5

Sto provando a inviare un messaggio con MessagePack da Cowboy a un browser su WebSocket e i dati ricevuti sono sempre vuoti o non validi. Sono in grado di inviare dati binari da JS al mio gestore cowboy, ma non viceversa. Sto usando Cowboy 1.0.4 con l'applicazione ufficiale msgpack-erlang. Io uso anche msgpack-lite per il mio javascript nel browser.Invio di dati binari su websocket con cowboy e MessagePack

Esempi:

websocket_handler:

websocket_handle({text, <<"return encoded">>}, Req, State) -> 
    %% sends encoded message to client. Client is unable to decode and fails 
    {reply, {binary, msgpack:pack(<<"message">>)}, Req, State}; 
websocket_handle({binary, Encoded}, Req, State) -> 
    %% Works as expected 
    lager:info("Received encoded message: ~p", [msgpack:unpack(Encoded)]), 
    {ok, Req, State}; 

JS:

var host = "ws://" + window.location.host + "/websocket"; 
window.socket = new WebSocket(host); 
socket.binaryType = 'arraybuffer'; 
socket.onmessage = function(event) { 
    var message = msgpack.decode(event.data); 
    console.log(message); 
}; 

browser restituisce un errore interno msgpack.min.js:

Error: Invalid type: undefined 
...ion n(t){var r=i(t),e=f[r];if(!e)throw new Error("Invalid type: "+(r?"0x"+r.toSt... 

Se provo a uscita ra w event.data per console, ecco cosa sto ottenendo:

ArrayBuffer {} 

Sembra essere vuoto per qualche motivo. Sono nuovo sia per erlang e msgpack, e non so cosa sta andando male. Grazie per l'aiuto!

risposta

3

Trovato il motivo del mio problema. Il modo in cui ho cercato di decodificare il messaggio sul client era sbagliato:

socket.onmessage = function(event) { 
    var message = msgpack.decode(event.data); 
    console.log(message); 
}; 

Il modo giusto:

socket.onmessage = function(event) { 
    var raw_binary_data = new Uint8Array(event.data); 
    var message = msgpack.decode(raw_binary_data); 
    console.log(message); 
}; 
0

Sembra che msgpack-lite non supporti il ​​tipo binario. Prova a comprimere i tuoi dati come una stringa.

{binary, msgpack:pack("message", [{enable_str, true}])} 
+0

Grazie, ma non aiuta. Penso che il motivo principale sia il valore vuoto di ArrayBuffer. Qualcosa non va con la configurazione, ma non so cosa :( –

+0

@ConstantineEmeraldMaster: Hai provato e verificato la comunicazione di WebSocket come previsto? Sospetto che non si ottiene nulla sul lato JS. Basta inviare prima la stringa spacchettata. –

+0

La comunicazione funziona in entrambe le direzioni utilizzando la modalità testo, funziona anche in 1 direzione (da client a server) in modalità binaria.JS client non è in grado di ricevere messaggi binari dal server –