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

发布于 2024-12-23 05:08:53 字数 148 浏览 0 评论 0原文

如何检测node.js中的消息边界?客户端发送消息的长度为:长度+数据

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

How can I detect the message boundary in node.js? The client sends messages with along their length: length + data.

socket.on(data) receives all data in one line. But, I need to receive only 2 bytes first then x bytes data.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

椵侞 2024-12-30 05:08:53

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

tcp sockets are just byte streams, there's no message boundary, you need to count the bytes consumed and compare this number to the one from the preamble.

here's a bit of code that does what you need. it's written in CoffeeScript, and uses 32-bit int for message size, so you'll have to adjust a bit.

  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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文