Как долго длится граница сообщения в node.js? - PullRequest
0 голосов
/ 29 декабря 2011

Как я могу обнаружить границу сообщения в node.js?Клиент отправляет сообщения по их длине: length + data.

socket.on(data) получает все данные в одну строку.Но мне нужно сначала получить только 2 байта, затем данные x байтов.

1 Ответ

0 голосов
/ 01 января 2012

сокеты 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
...