2016-03-22 11 views
5

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

例:

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... 

私がしようとした場合出力ra w event.dataをコンソールに送信すると、次のようになります。

ArrayBuffer {} 

何らかの理由で空になっているようです。私はerlangmsgpackの両方に新しいです、そして何がうまくいかないのか分かりません。ご協力いただきありがとうございます!

答えて

3

私の問題の原因が見つかりました。 私は、クライアント上でメッセージを解読しようとしたどのような方法が間違っていた:

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

msgpack-liteはバイナリタイプをサポートしていないようです。データを文字列としてパックしてみてください。

+0

おかげで、それは役立ちません。私は主な理由は空のArrayBufferの値だと思う。設定が間違っていますが、何がわかりません:( –

+0

@ ConstantineEmeraldMaster:WebSocket通信が正常に動作することを試しましたか?JS側で何も取得できないと思われます。 –

+0

テキストモードを使用する双方向通信は、バイナリモードで1方向(クライアントからサーバへ)でも動作します。JSクライアントはサーバからバイナリメッセージを受信できません。 –

関連する問題