接收节点服务器中websocket发送的数据

时间:2014-02-08 09:37:03

标签: javascript node.js websocket

建立套接字连接

客户端:

socket.onopen = function(){
    socket.send("a");
}

服务器:

socket.setEncoding("utf-8");
socket.on('data',function(buff){
   console.log(buff);
   console.log(buff.toString('utf-8'));
});

它有类似的东西:

Buffer 81 81 19 2d 01 51 78 88 80 30 71 21 90  
��-Qx��0q!�

如何在节点服务器中获得a

一些有用的注释(可能):

客户端套接字日志:

WebSocket {binaryType: "blob", extensions: "", protocol: "", onclose: function, onerror: null…}

1 个答案:

答案 0 :(得分:1)

您遇到的是WebSocket框架的屏蔽有效负载。让我们仔细看看二进制视图中的一个框架(你的框架似乎对我无效):

0x81 0x85 0x37 0xfa 0x21 0x3d 0x7f 0x9f 0x4d 0x51 0x58

字节0:

1000 0001
^       ^
|       Text opcode
|
FINAL Flag

字节1:

1000 0001
^       ^
|       Payload length of 1 byte
|
Masked Flag

字节2-5:

0x37 0xfa 0x21 0x3d

在这种情况下使用屏蔽来在将有效负载发送到服务器时“加密”。

第6行:

0x7f 0x9f 0x4d 0x51 0x58
"H"  "e"  "l"  "l"  "o"

这是屏蔽的有效负载。每个字节代表一个字符。

现在您需要通过执行以下操作来取消屏蔽有效负载:

var masking = new Buffer([0x37, 0xfa, 0x21, 0x3d]);
var payload = new Buffer([0x7f, 0x9f, 0x4d, 0x51, 0x58]);

for (var i = 0; i < payload.length; i++) {
    payload[i] = payload[i] ^ masking[i % 4];
}

// tada this should be "Hello"
console.log(payload.toString());

“^”是XOR的按位运算符。您通过使用指定的屏蔽字节对其进行异或来以某种方式将字节转换为另一种状态。因为我们有四个屏蔽字节“%4”确保我们遍历单个屏蔽字节。

如果您对如何进一步实施WebSockets感兴趣,建议您阅读standard和我的transform stream based implementation。代码应该更好地阅读和理解为常见的socket.io包。此外,我没有在顶部添加任何内容,因此它们更接近RFC6455标准。