Как сохранить Node.js от разбиения сообщений сокетов на более мелкие куски - PullRequest
5 голосов
/ 09 августа 2010

У меня есть программа чата, которая передает данные JSON из Apache / PHP в Node.js через сокет TCP:

// Node.js (Javascript)
phpListener = net.createServer(function(stream)
{
    stream.setEncoding("utf8");
    stream.on("data", function(txt)
    {
        var json = JSON.parse(txt);

        // do stuff with json
    }
}
phpListener.listen("8887", 'localhost');

// Apache (PHP)
$sock = stream_socket_client("tcp://localhost:8887");
$written = fwrite($sock, $json_string);
fclose($sock);

Проблема в том, что строка JSON достаточно велика (болееоколо 8k), выходное сообщение разбивается на несколько частей, и анализатор JSON завершается ошибкой.PHP возвращает записанное значение $ как правильную длину строки, но обработчик события данных запускается дважды или более.

Должен ли я присоединять функцию к другому событию или есть способ кэшировать текст черезсобытия, которые не поддаются условиям гонки при большой нагрузке?Или какое-то другое решение, о котором я не думал?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Вы должны попытаться использовать буфер для кэширования данных, поскольку Node.js имеет тенденцию разбивать данные для повышения производительности.

http://nodejs.org/api.html#buffers-2

вы можете буферизовать все ваши запросы, а затем вызвать функцию с сохраненными в ней данными.

1 голос
/ 09 августа 2010

TCP-сокеты не обрабатывают буферизацию для вас. Как это могло? Он не знает, какой протокол прикладного уровня вы используете, и поэтому понятия не имеет, что такое «сообщение». Вы должны спроектировать и реализовать другой протокол поверх него и обработать любую необходимую буферизацию.

Но Node.js имеет встроенный протокол прикладного уровня поверх TCP, который автоматически обрабатывает буферизацию для вас: модуль http. Если для этого вы используете модуль http вместо модуля tcp, вам не нужно беспокоиться о фрагментации пакетов и буферизации.

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