2015-04-17 46 views
2

我有一个python应用程序,它包含一个发送到HTML5/javascript GUI的Autobahn websocket服务器。我一直在使用JSON在它们之间传输数据,但现在我开始强调带宽,因为我需要在一些消息中发送1000个(单精度)3D位置的数组。如果我理论上可以为每个数字发送4个字节,那么将每个这些浮点数作为JSON文本写出来似乎是一种明显的浪费。 BSON似乎是一个更好的主意,但我似乎无法得到它的工作。通过websockets从python发送BSON到JavaScript

这里是我的代码的要点:

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

我:

# 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方面的消息,我的异常处理程序与触发我正在使用javascript端的mongodb bson library的浏览器版本,以及Python端的pymongo bson implementation

回答

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); 
    } 
}; 
相关问题