通过带有faye的websockets发送javascript对象

时间:2012-10-23 10:39:21

标签: node.js serialization websocket javascript-objects faye

大家好我正试图通过websockets发送一个javascript对象:

faye-websockets文档说:

发送(消息) 接受字符串或缓冲区,并通过连接向另一个对等方发送文本或二进制消息。

服务器端我正在使用节点和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);

客户方:

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

我的错误是什么?感谢

3 个答案:

答案 0 :(得分:76)

WebSockets支持发送和接收:字符串,类型化数组(ArrayBuffer)和Blob。在发送之前,必须将Javascript对象序列化为上述类型之一。

要将对象作为字符串发送,您可以使用内置的JSON支持:

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

要将对象作为类型化数组发送,您可以使用javascript BSON库,例如this one

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

当您收到WebSocket消息时,您需要对其进行反序列化。

从WebSocket消息反序列化JSON字符串:

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

如果您通过WebSocket使用二进制消息,那么首先应设置binaryType属性,以便将所有二进制消息作为类型化数组接收:

ws.binaryType = "arraybuffer";

然后反序列化将如下所示:

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

以下是关于using BSON in Javascript;

的博客文章

答案 1 :(得分:2)

客户端:

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

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

服务器:

 const data = bson.serialize({ ... });
 ws.send(data);

答案 2 :(得分:1)

我基本上使用的是Socket.IO,但看起来您需要在服务器中对数据进行字符串化并在客户端中解析它,如下所示:

在服务器中:

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

在客户端:

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