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

frx*_*x08 34 serialization websocket node.js javascript-objects faye

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

faye-websockets文档说:

send(message) 接受String或Buffer,并通过连接向另一个peer发送文本或二进制消息.

服务器端我正在使用节点和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);
Run Code Online (Sandbox Code Playgroud)

客户端:

<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>
Run Code Online (Sandbox Code Playgroud)

我的错误是什么?谢谢

kan*_*aka 78

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

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

ws.send(JSON.stringify(object));
Run Code Online (Sandbox Code Playgroud)

要发送一个对象作为一个类型数组,你可以使用JavaScript库BSON比如这一个:

ws.send(BSON.serialize(object));
Run Code Online (Sandbox Code Playgroud)

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

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

ws.onmessage = function (e) {
    var object = JSON.parse(e.data);
    ...
};
Run Code Online (Sandbox Code Playgroud)

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

ws.binaryType = "arraybuffer";
Run Code Online (Sandbox Code Playgroud)

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

ws.onmessage = function (e) {
    var object = BSON.deserialize(e.data);
    ...
};
Run Code Online (Sandbox Code Playgroud)

这是一篇关于在Javascript中使用BSON的博客文章;

  • @MartinKonecny WebSockets是基于消息的,消息是完整传递的(没有部分消息).但是,请注意,如果你在中间有类似websockify的东西,并且你实际上在另一端与常规TCP服务器通信,则消息分区是任意的(取决于TCP数据包大小,内核窗口大小,缓冲区大小等) .在这种情况下,您需要自己进行某种重新组装. (3认同)
  • 你的链接已经死了:/并且js-bson的git repo上没有任何readme.md.要搜索一些文档. (2认同)