Как разделить сообщения сокета TCP в node.js - PullRequest
6 голосов
/ 25 декабря 2011

Я режу зубы с помощью TCP-сокетов и меня смущает то, как сообщения приходят в мое приложение. Похоже, они распались. Кто-нибудь знает, как я могу лучше присоединиться к ним вместе? Все сообщения разделяются переводом строки (\ r \ n)

var stream = net.createConnection(port,host); 
stream.setEncoding("utf8");

stream.on('data', function(chunk){
    console.log('data: ' + sys.inspect(chunk));
});

Пример того, как выглядит дамп на консоль:

data: '0'
data: '5293800791D04\r'
data: '\n'
data: '053138007928F1\r\n'
data: '05313800012869\r\n'
data: '052E3800790E0E\r\n'
data: '052E3800010E86\r\n'
data: '05223'
data: '8007933F5\r\n'
data: '05213800791019\r\n'
data: '05213800795C795B79265A\r\n'
data: '05213800011091\r\n'

Мне нужно разбить вещи на разрыв строки, чтобы у меня не было неполных сообщений. Есть ли способ сказать ноду, чтобы сделать это для меня? Если нет, есть ли у кого-нибудь примеры того, как это можно сделать?

Ответы [ 2 ]

7 голосов
/ 25 декабря 2011

Я нашел модуль под названием «Карьера», который делает именно то, что мне было нужно.После установки модуля это было так же просто, как добавить это:

carrier.carry(stream, function(line) {
    console.log("line: "+line)
})

Я нашел ответы здесь:

http://nodetuts.com/tutorials/5-a-basic-tcp-chat-server.html

https://github.com/pgte/carrier

5 голосов
/ 25 декабря 2011

Поскольку TCP является потоковым протоколом (а не блочным протоколом ), он не поддерживает никаких границ между тем, что вы можете считать отдельными сообщениями.Это ответственность получателя, если вам нужно повторно собрать высокоуровневые сообщения из входящего потока.

Вы можете сделать это, добавив слой, который считывает входные данные в буфер, а затем освобождает одну строку ввремя, когда он видит \r\n во входном потоке.

В качестве отступления, если вы можете изменить данные потока, чтобы иметь только один символ разделителя (такой как только \n)код буферизации может стать немного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...