Мое решение этой проблемы заключается в отправке сообщений JSON, каждое из которых заканчивается специальным символом Unicode.Символ, который вы никогда не получите в строке JSON.Назовите его TERM.
Таким образом, отправитель просто делает "JSON.stringify (message) + TERM;"и пишет это.Затем получатель разбивает входящие данные в TERM и анализирует части с помощью JSON.parse (), что довольно быстро.Хитрость в том, что последнее сообщение может не анализироваться, поэтому мы просто сохраняем этот фрагмент и добавляем его в начало следующего сообщения, когда оно приходит.Получение кода выглядит следующим образом:
s.on("data", function (data) {
var info = data.toString().split(TERM);
info[0] = fragment + info[0];
fragment = '';
for ( var index = 0; index < info.length; index++) {
if (info[index]) {
try {
var message = JSON.parse(info[index]);
self.emit('message', message);
} catch (error) {
fragment = info[index];
continue;
}
}
}
});
Где «фрагмент» определяется где-то, где он будет сохраняться между порциями данных.
Но что такое TERM?Я использовал символ замены Unicode '\ uFFFD'.Можно также использовать технику, используемую в твиттере, где сообщения разделяются '\ r \ n', а твиты используют '\ n' для новых строк и никогда не содержат '\ r \ n'
Я считаю, что этонамного проще, чем возиться с включением длины и тому подобное.