2012-10-23 15 views
24

Witam wszystkich Próbuję wysłać JavaScript Object przez WebSocket:wysyłając JavaScript Object przez WebSocket Faye

dokumentacja Faye-WebSockets mówi:

send (message)akceptuje albo Łańcuch lub bufor i wysyła wiadomość tekstową lub binarną przez połączenie z drugim urządzeniem równorzędnym.

Strona serwera Używam węzła i faye.

var WebSocket = require('faye-websocket'); 
var http = require('http'); 

var server = http.createServer(); 
server.addListener('upgrade', function(request, socket, head) { 
    var ws = new WebSocket(request, socket, head); 
    ws.send({topic:'handshake', data:'sdf487rgiuh7'}); 
}); 
server.listen(8000); 

po stronie klienta:

<script> 
    var ws = new WebSocket('ws://localhost:8000'); 
    ws.onmessage = function(e) { 
     console.log(e.data); //prints [Object object] string and not the object 
    }; 
</script> 

co jest mój błąd? Dzięki

+0

którzy dają -1 wyjaśnia przyczynę proszę .. – frx08

+3

-1 jest prawdopodobne, ze względu na fakt, że komunikat o błędzie już mówiłem dokładnie co jest nie tak. –

Odpowiedz

64

WebSockets obsługuje wysyłania i odbierania: smyczki, wpisane tablic (ArrayBuffer) i plamy. Przed wysłaniem obiekty JavaScript muszą być serializowane do jednego z powyższych typów.

Aby wysłać obiekt jako ciąg znaków można użyć wbudowanego wsparcia JSON:

ws.send(JSON.stringify(object)); 

Aby wysłać obiekt jako wpisywanych tablicy można wykorzystać javascript biblioteki BSON takich jak this one:

ws.send(BSON.serialize(object)); 

Po otrzymaniu komunikatu WebSocket należy go przekształcić z postaci szeregowej.

deserializacji ciąg JSON z wiadomości websocket:

ws.onmessage = function (e) { 
    var object = JSON.parse(e.data); 
    ... 
}; 

Jeśli używasz wiadomości binarne nad websocket, to najpierw należy ustawić atrybut binaryType aby otrzymywać wszystkie wiadomości binarnych jako wpisane tablic:

ws.binaryType = "arraybuffer"; 

Następnie deserializacji będzie wyglądać następująco:

ws.onmessage = function (e) { 
    var object = BSON.deserialize(e.data); 
    ... 
}; 

Oto blogu na temat o using BSON in Javascript;

+2

Twój link jest martwy:/I nie ma żadnego readme.md na repozytorium git js-bson. Przeszukuję jakiś dokument. – Vadorequest

+1

https://github.com/mongodb/js-bson – Vadorequest

+1

Czy jest możliwe, że wywołanie zwrotne 'onmessage' nie zwróci całego łańcucha json, a zatem' JSON.parse' zgłasza błąd parsowania? –

1

Ja w zasadzie pracy z Socket.IO, ale wygląda na to trzeba stringify danych na serwerze i przetwarza go w kliencie tak:

w serwerze:

ws.send(JSON.stringify({topic:'handshake', data:'sdf487rgiuh7'})); 

w kliencie:

console.log(JSON.parse(e.data)); 
+0

w twoim przypadku wysyłasz ciąg znaków, ale ponieważ faye obsługuje wysyłanie danych binarnych, chcę wykorzystać tę funkcję – frx08

+1

@ frx08 Obiekt JS nie jest danymi binarnymi, obraz byłby. Tak więc odpowiedź udidus jest poprawna. – dom

+1

, więc jedyną metodą serializacji obiektu js jest jego stringify? – frx08

0

Klient:

const bson = new BSON(); 
ws.binaryType = 'arraybuffer'; 

ws.onmessage = function(event) { 
    console.log(bson.deserialize(Buffer.from(event.data))); 
} 

Serwer:

const data = bson.serialize({ ... }); 
ws.send(data); 
Powiązane problemy