2016-03-22 22 views
5

Próbuję wysłać wiadomość zakodowaną przez MessagePack z Cowboy do przeglądarki przez WebSocket, a otrzymane dane są zawsze puste lub nieprawidłowe. Jestem w stanie wysłać dane binarne z JS do mojego handlarza kowbojem, ale nie odwrotnie. Używam aplikacji Cowboy 1.0.4 z oficjalną aplikacją msgpack-erlang. Używam również msgpack-lite dla mojego javascriptu w przeglądarce.Wysyłanie danych binarnych przez websocket z kowbojem i MessagePack

Przykłady:

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); 
}; 

Przeglądarka zwraca błąd wewnątrz 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... 

Gdy próbuję wyjście ra W event.data pocieszyć, oto co mi chodzi:

ArrayBuffer {} 

To wydaje się być pusta z jakiegoś powodu. Jestem nowy zarówno dla erlang i msgpack, i nie wiem, co idzie źle. Dzięki za pomoc!

Odpowiedz

3

Znaleźliśmy przyczynę mojego problemu. Sposób w jaki sposób starałem się rozszyfrować wiadomość na kliencie mylił:

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

Właściwy sposób:

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

Wygląda na to, że msgpack-lite nie obsługuje typu binarnego. Spróbuj spakować dane jako ciąg znaków.

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

Dzięki, ale to nie pomaga. Myślę, że głównym powodem jest pusta wartość ArrayBuffer. Coś nie tak z konfiguracją, ale nie wiem co :( –

+0

@ConstantineEmeraldMaster: Czy próbowałeś i zweryfikowałeś komunikację WebSocket działając zgodnie z oczekiwaniami? Podejrzewam, że nic nie dostajesz po stronie JS. Po prostu wyślij najpierw łańcuch rozpakowany. –

+0

Komunikacja działa w obu kierunkach za pomocą trybu tekstowego, działa również w jednym kierunku (od klienta do serwera) w trybie binarnym Klient JS nie może odbierać wiadomości binarnych z serwera –