Node.js TCP входящее сообщение разбивается на пакеты - PullRequest
1 голос
/ 03 января 2012

У меня проблема при получении больших пакетов в Node.js через TCP-соединение.Кажется, что в буфере установлено ограничение около 55 КБ.Когда я получаю большие объемы данных (около 70-80 тыс.), Эти данные разбиваются на части.

Теперь я работал с UDP-сокетами, я знаю, как ожидать on('data', function(){}) событий и как ожидать on('end', function(){}) Когда сообщение, наконец, получено, проблема с TCP заключается в том, что я никогда не получаю событие on('end', function(){}), сервер (в C #) никогда не отправляет пакет FIN.Это связано с тем, что мне требуется поддерживать работоспособность сокета (мы не хотим его выключать).

Существует ли какой-то способ отправки пакета FIN с C # на узел.js one, без необходимости выключать / закрывать сокет?

Или, альтернативно, это какой-то способ вызвать событие on('end', function(){}) внутри самого узла?

С уважением.

РЕДАКТИРОВАТЬ: Чтобы добавить к вопросу, скажем, например, у меня есть 2 клиента, пытающихся получить информацию через сокет TCP.Один подключается первым и получает огромный запрос (здесь нет проблем с размером).

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

Ответы [ 3 ]

5 голосов
/ 03 января 2012

UDP является пакетно-ориентированным. Вы можете отправить столько данных, сколько поместится в пакете, до абсолютного максимума в 65 507 байт. Это огонь и забыл, без встроенного механизма для обработки потери пакетов или переупорядочения.

TCP ориентирован на поток. Ваши данные будут разбиты на пакеты в зависимости от нескольких факторов, включая объем данных и скорость передачи. Это в основном вне вашего контроля и управляется стеком TCP / IP. В ответ вы получаете упорядоченную последовательность пакетов и степень отказоустойчивости (правильный порядок пакетов гарантирован, а потерянные / дублированные пакеты обнаруживаются и обрабатываются стеком протокола TCP / IP прозрачно для кода приложения).

Если вы работаете на уровне сокетов в узле, вы почти наверняка получите несколько обратных вызовов, каждый из которых содержит кусок данных. Вам решать, чтобы сшить это снова вместе. Это хорошо - это означает, что вы можете определить свой собственный механизм для определения границ сообщений, сжатия данных и т. Д. И т. Д.

1 голос
/ 18 февраля 2012

У меня была похожая проблема, похоже, вам нужно будет использовать два метода:

  1. Способ разобрать сообщение и собрать его вместе - я использовал следующий ответ [вопрос]: nodejs - разбор фрагментированного твиттера json
  2. Вы можете либо запустить новое tcp-соединение для второго клиента, либо создать массив, содержащий clientID для каждого сделанного запроса.Когда сообщение возвращается с сервера, вы берете первый clientID в массиве и передаете сообщение им.
0 голосов
/ 03 января 2012

Я бы сказал, чтобы попытаться буферизовать и добавить

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