通过websockets将BSON从python发送到javascript

时间:2015-04-17 19:08:58

标签: javascript python websocket bson

我有一个python应用程序,其中包含一个要发送到HTML5 / javascript GUI的Autobahn websocket服务器。我一直在使用JSON在它们之间传输数据,但我现在真的开始强调我的带宽,因为我需要在我的一些消息中发送1000个(单精度)3D位置的数组。将每个浮点数作为JSON文本编写似乎是一个明显的浪费,当我理论上只为每个数字发送4个字节。 BSON似乎是一个更好的主意,但我似乎无法让它发挥作用。

以下是我的代码的要点:

# Python side
class BroadcastServerFactory(WebSocketServerFactory):
    # ...
    def broadcast_message(message):
        bson_msg = bson.BSON.encode(msg)
        prepared_msg = self.prepareMessage(bson_msg, isBinary=True)
        for c in self.clients:
            self.clients[c].sendPreparedMessage(prepared_msg)
// Javascript side
app.sock = new WebSocket('ws://127.0.0.1:9090');
app.sock.binaryType = "arraybuffer";
// ...
sock.onmessage = function(e) {
    var msg = null;
    try {
        msg = BSON.deserialize(e.data);
    }
    catch(err) {
        console.log('Failed to deserialize: ', err);
    }
    if(msg) app.onmessage(msg);
};

不幸的是,只要我在javascript端收到消息,我的异常处理程序就会触发:

Failed to deserialize:  Error: corrupt bson message {stack: (...), message: "corrupt bson message"}

我在javascript端使用mongodb bson library的浏览器版本,在Python端使用pymongo bson implementation

1 个答案:

答案 0 :(得分:2)

经过多次摆弄后,我似乎找到了一个有效的解决方案:

// Javascript side
app.sock = new WebSocket('ws://127.0.0.1:9090');
app.sock.binaryType = "blob"; // Changed from "arraybuffer"
// ...
sock.onmessage = function(e) {
    try {
        var reader = new FileReader();
        reader.onload  = function() {
            uint8Array  = new Uint8Array(this.result);
            app.onmessage(BSON.deserialize(uint8Array));
        }
        reader.readAsArrayBuffer(e.data);

    }
    catch(err) {
        console.log('Failed to deserialize: ', err);
    }
};