如何检测 node.js 中的消息边界?客户端发送消息的长度为:length + data
。
socket.on(data)
在一行中接收所有数据。但是,我只需要先接收 2 个字节,然后再接收x
字节数据。
tcp 套接字只是字节流,没有消息边界,您需要计算消耗的字节并将此数字与序言中的数字进行比较。
这里有一些代码可以满足您的需要。它是用 CoffeeScript 编写的,并且使用 32 位 int 作为消息大小,因此您必须进行一些调整。
remaining = 0
input = undefined
msgsize = 0
msbuf = new Buffer 4
msneeded = 4
sock.on 'data', (bytes) =>
start = 0
end = bytes.length
while start < bytes.length
if remaining == 0
msavail = (Math.min 4, bytes.length - start)
bytes.copy msbuf, msbuf.length - msneeded, start, start + msavail
msneeded -= msavail
continue if msneeded > 0
msneeded = 4
remaining = msgsize = msbuf.readUInt32LE 0
start += 4
input = new Buffer msgsize
end = (Math.min start + remaining, bytes.length)
bytes.copy input, msgsize - remaining, start, end
remaining -= (end - start)
start = end
@emit 'data', input if 0 == remaining