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!
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 :( –
@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. –
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 –