Я не знаю, является ли это главной или единственной проблемой, но этот фрагмент кода имеет потенциальные проблемы:
socket.on('data', (data)=>{
resolve(data);
socket.end();
});
Сокет TCP - это поток. Данные, которые вы отправляете на одном конце сокета, могут поступать на другом конце в чанке любого размера и не обязательно поступать в чанке того же размера, который отправил отправитель. Этот фрагмент кода, по-видимому, предполагает, что как только поступают какие-либо данные, все данные находятся здесь, и сокет может быть закрыт (потенциально пропуская другие данные, которые все еще поступают). Если вы не отправляете только один байт через сокет, это просто неправильно.
Вместо этого вам нужен какой-то известный формат данных в сокете, чтобы вы знали, когда вы получили полный пакет или сообщение или передачу, и вы должны накапливать данные до тех пор, пока не прибудет полное сообщение / пакет, и он может прийти в несколько частей.
Есть много разных способов сделать это. Если ваши данные являются текстовыми, вы можете пометить конец фрагмента текста символом новой строки, нулевым символом или любым другим символом, который не встречается в ваших данных, и вы читаете данные, пока не увидите маркер, указывающий на наличие полного сообщения. , Если ваши данные не являются текстовыми, вы можете сначала отправить длину в четыре байта, которая сообщит вам, сколько байтов данных поступает. Существует множество других способов форматирования данных, чтобы вы могли знать, когда у вас есть полное сообщение / пакет.
Также важно знать, что эта проблема может не отображаться в быстрой локальной сети, но может быть уязвимы на более медленных каналах связи, которые могут привести к разбивке данных на более мелкие пакеты.
Обратите внимание, что протокол webSocket имеет очень удобный, предопределенный формат пакетов, который сделает всю эту работу за вас. Вам понадобится клиент webSocket на одном конце и сервер webSocket на другом, чтобы использовать его.
Также см. Следующее:
Правильный способ установить sh границы для TCP-соединение
Имеет ли node js «response.on (« data », fun c (chunk))» гарантию границы чанка
NodeJs - TCP / IP Socket отправлять / получать серийно?