2016-03-22 19 views
5

Cowboy'dan WebSocket üzerinden bir tarayıcıya MessagePack ile kodlanmış bir ileti göndermeye çalışıyorum ve alınan veri her zaman boş veya geçersizdir. JS'den kovboy işleyicime ikili veri gönderebiliyorum, ancak tam tersi değil. Resmi msgpack-erlang uygulamasıyla Cowboy 1.0.4 kullanıyorum. Ayrıca tarayıcıdaki javascript için msgpack-lite kullanıyorum.Kovboy ve MessagePack ile web üzerinden ikili veri gönderme MessagePack

Örnekler:

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

Tarayıcı msgpack.min.js iç hata verir:

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

Ben denerseniz çıkış ra konsol için w event.data, işte şunu alıyorum:

ArrayBuffer {} 

Bazı nedenlerle boş görünüyor. Hem erlang hem de msgpack için yeniyim ve neyin yanlış gittiğini bilmiyorum. Yardım ettiğin için teşekkür ederim!

cevap

3

Sorunumun nedenini buldum.

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

doğru yolu: Ben istemci üzerinde mesajı çözme çalıştı nasıl yolu yanlıştı

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 ikili türü desteklemiyor gibi görünüyor. Verilerinizi bir dize olarak paketlemeyi deneyin.

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

Teşekkür ama yardımcı olmuyor. Sanırım ana sebep boş ArrayBuffer değeri. Yapılandırmayla ilgili bir sorun var, ama ne olduğunu bilmiyorum :( –

+0

@ConstantineEmeraldMaster: WebSocket iletişimini beklediğiniz gibi denediniz mi ve doğruladınız mı? JS tarafında hiçbir şey alamadığınızdan şüpheleniyorum. –

+0

İletişim, metin modunu kullanarak her iki yönde de çalışır, ikili modda 1 yönde (istemciden sunucuya) çalışır. JS istemcisi, sunucudan ikili iletileri alamıyor –