在Node中 使用 nodejs-websocket 发送接收数据,例如发送如下数据包
{"route":"ping","data":{}}
接收端接收到的数据为:
[129,154,84,20,211,1,47,54,161,110,33,96,182,35,110,54,163,104,58,115,241,45,118,112,178,117,53,54,233,122,41,105,129,154,84,20,211,1,47,54,161,110,33,96,182,35,110,54,163,104,58,115,241,45,118,112,178,117,53,54,233,122,41,105]
在 Connection.js 中进行了一次数据解压,示例代码如下:
function extractFrame(buffer){
var fin, opcode, B, HB, mask, len, payload, start, i, hasMask
if (buffer.length < 2) {
return
}
// Is this the last frame in a sequence?
B = buffer[0]
HB = B >> 4
if (HB % 8) {
// RSV1, RSV2 and RSV3 must be clear
return false
}
fin = HB === 8
opcode = B % 16
if (opcode !== 0 && opcode !== 1 && opcode !== 2 &&
opcode !== 8 && opcode !== 9 && opcode !== 10) {
// Invalid opcode
return false
}
if (opcode >= 8 && !fin) {
// Control frames must not be fragmented
return false
}
B = buffer[1]
hasMask = B >> 7
if ((!hasMask) || (hasMask)) {
// Frames sent by clients must be masked
// return false
}
len = B % 128
start = hasMask ? 6 : 2
if (buffer.length < start + len) {
// Not enough data in the buffer
return
}
// Get the actual payload length
if (len === 126) {
len = buffer.readUInt16BE(2)
start += 2
} else if (len === 127) {
// Warning: JS can only store up to 2^53 in its number format
len = buffer.readUInt32BE(2) * Math.pow(2, 32) + buffer.readUInt32BE(6)
start += 8
}
if (buffer.length < start + len) {
return
}
// Extract the payload
payload = buffer.slice(start, start + len)
if (hasMask) {
// Decode with the given mask
mask = buffer.slice(start - 4, start)
for (i = 0; i < payload.length; i++) {
payload[i] ^= mask[i % 4]
}
}
var result = payload.toString();
return result;
}
var buffer = new Buffer([129,154,84,20,211,1,47,54,161,110,33,96,182,35,110,54,163,104,58,115,241,45,118,112,178,117,53,54,233,122,41,105,129,154,84,20,211,1,47,54,161,110,33,96,182,35,110,54,163,104,58,115,241,45,118,112,178,117,53,54,233,122,41,105]);
//数据解压
var result = extractFrame(buffer);
console.log(result);
//输出数据 {"route":"ping","data":{}}