Возможно, это связано с неправильной обработкой потока из сокета (сероятнее всего, на клиенте), поскольку вы не пользуетесь carrier или другой буферизацией/делением. Событие data не означает, что в нем содержится именно так строка, которую послала вторая сторона. Там может быть часть из неё, а может быть и несколько строк сразу (зависит от размера данных и размера буфера передачи). Таким образом, данные могут быть потеряны, если например две команды сервера попадают в одно событие «data», заваливая распознавание пакета (на клиенте, в частности, в зависимости от реализации). На этот камень я наступал, способ решения —
carrier, какой-нибудь сокетный фреймворк или свой вариант протокола верхнего уровня. Вот пример демонстрирующих тестов:
Скрытый текст// server.js
var net = require('net');
var server = new net.Server();
process.on('uncaughtException', function (err) {
console.log(err.stack);
});
server.listen(12345);
server.on('connection', function (connection) {
console.log('connection');
connection.on('data', function (data) {
console.log('server data', data.toString());
connection.write(data);
});
connection.on('end', function () {
console.log('server end');
});
});
// client.js
var net = require('net');
var client = new net.Socket();
process.on('uncaughtException', function (err) {
console.log(err.stack);
});
client.connect(12345);
client.on('connect', function (connection) {
console.log('connect');
client.on('data', function (data) {
console.log('client data', data.toString());
});
client.on('end', function () {
console.log('client end');
});
});
setTimeout(function () {
"use strict";
client.write('string1');
client.write('string2');
}, 100);
setTimeout(function () {
"use strict";
var i = 100000;
var string = '';
while (i--) {
string += i;
}
client.write(string);
}, 200);
setTimeout(function () {
"use strict";
client.write('string3');
client.end('string4');
}, 300);
Если моё предположение неверно и вы об этом позаботились, тогда нужно делать tcpdump с фильтром по порту, и смотреть, что и куда приходит и уходит.