如何在node.js中检测消息边界?客户端发送的邮件长度为length + data
。
socket.on(data)
接收一行中的所有数据。但是,我需要先接收2个字节,然后再接收x
个字节数据。
答案 0 :(得分:0)
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