node.js中的消息边界有多长?

时间:2011-12-29 09:30:48

标签: sockets node.js message boundary

如何在node.js中检测消息边界?客户端发送的邮件长度为length + data

socket.on(data)接收一行中的所有数据。但是,我需要先接收2个字节,然后再接收x个字节数据。

1 个答案:

答案 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