7

WebSocket 経由で Cowboy からブラウザに MessagePack でエンコードされたメッセージを送信しようとしていますが、受信したデータは常に空または無効です。JS からカウボーイ ハンドラーにバイナリ データを送信できますが、その逆はできません。msgpack-erlang公式アプリケーションでCowboy 1.0.4を使用しています。msgpack-liteブラウザ内の JavaScriptにも使用します。

例:

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

ブラウザは 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...

生の event.data をコンソールに出力しようとすると、次のようになります。

 ArrayBuffer {}

なぜか空いているようです。私はerlangとの両方が初めてmsgpackで、何が問題なのかわかりません。ご協力いただきありがとうございます!

4

3 に答える 3

6

私の問題の理由を見つけました。クライアントでメッセージをデコードしようとした方法が間違っていました:

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

正しい方法:

socket.onmessage = function(event) {
    var raw_binary_data = new Uint8Array(event.data);
    var message = msgpack.decode(raw_binary_data);
    console.log(message);
};
于 2016-03-25T15:39:24.597 に答える
0

Uint8Array を使用することは、クライアント側の問題に対する有効な解決策です。サーバーで文字列をパックするには、次を使用します。

msgpack:pack(<<"message">>,[{pack_str,from_binary}])

出典:記事

于 2018-03-17T13:21:40.107 に答える