使用 faye 通过 websockets 发送 javascript 对象

Posted

技术标签:

【中文标题】使用 faye 通过 websockets 发送 javascript 对象【英文标题】:sending a javascript object through websockets with faye 【发布时间】:2012-10-13 06:38:08 【问题描述】:

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

faye-websockets 文档说:

send(message) 接受 String 或 Buffer 并通过连接向其他对等方发送文本或二进制消息。

服务器端我用的是node和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>

我的错误是什么?谢谢

【问题讨论】:

谁给-1请解释原因.. -1 可能是因为错误消息已经告诉您确切的问题所在。 【参考方案1】:

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

在服务器中:

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

在客户端:

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

【讨论】:

在您的情况下,您正在发送一个字符串,但由于 faye 支持发送二进制数据,我想利用此功能 @frx08 JS 对象不是二进制数据,而是图像。所以 udidus 的回答是正确的。 那么序列化一个js对象的唯一方法就是把它字符串化? “字符串化”一个对象是“用 JSON 序列化”的另一种说法【参考方案2】:

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的博文;

【讨论】:

您的链接已失效:/ js-bson 的 git repo 上没有任何 readme.md。会搜索一些文档。 有没有可能onmessage回调没有返回整个json字符串,因此JSON.parse会抛出解析错误? @MartinKonecny WebSockets 是基于消息的,消息是完整传递的(没有部分消息)。但是,请注意,如果您在中间有类似 websockify 的东西,并且您实际上正在与另一端的常规 TCP 服务器通信,则消息划分是任意的(取决于 TCP 数据包大小、内核窗口大小、缓冲区大小等) .在这种情况下,您需要自己进行某种重新组装。 谢谢,我认为 websocket 只是通过 http 启动的普通套接字。很高兴知道是基于消息的。【参考方案3】:

客户:

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

【讨论】:

以上是关于使用 faye 通过 websockets 发送 javascript 对象的主要内容,如果未能解决你的问题,请参考以下文章

Faye:即使套接字打开,也无法在浏览器中发送 GET 消息,通过 CURL 工作和响应数据

带有 scala 客户端的 ruby​​ faye 服务器

Websockets 与主要应用程序(nginx + 乘客 + faye)

Faye Websocket 错误 Rails 2.2.2(生产)

缺少 Websocket 标头

ruby 中的安全 Websocket 客户端