Излучатель событий Node JS на net.createserver

Итак, у меня возникла проблема, и я застрял на 3 дня, я использую узел js в качестве сервера сокетов для получения строки и обработки некоторых данных json, чтобы дать строковый ответ клиенту сокета, стек, используемый в узле js (net, события), мой код не имеет проблем для первого запроса, но после второго запроса он получил такую ​​​​ошибку (сервер):

[2020-12-23T07:45:13.821Z] server listening on port: 4444
[2020-12-23T07:45:15.696Z] New Connection : ::ffff:127.0.0.1
[2020-12-23T07:45:15.701Z] message: string
[2020-12-23T07:45:15.702Z] executing call function
[2020-12-23T07:45:15.703Z] oncall function
[2020-12-23T07:45:15.703Z] executing emit
[2020-12-23T07:45:15.704Z] {
  orig: 'orig',
  origParam: { number: '123456' },
  resp: [
    {
      content: [Array],
      firstPage: true,
      lastPage: true,
      number: 0,
      numberOfElements: 1,
      size: 1,
      sort: null,
      totalElements: 1
    },
    { result: 'UNMATCHED' }
  ]
}
[2020-12-23T07:45:15.707Z] Returning : diterima
[2020-12-23T07:45:42.403Z] New Connection : ::ffff:127.0.0.1
[2020-12-23T07:45:42.407Z] message: string
[2020-12-23T07:45:42.408Z] executing call function
[2020-12-23T07:45:42.408Z] oncall function
[2020-12-23T07:45:42.409Z] executing emit
[2020-12-23T07:45:42.409Z] {
  orig: 'orig',
  origParam: { number: '123456' },
  resp: [
    {
      content: [Array],
      firstPage: true,
      lastPage: true,
      number: 0,
      numberOfElements: 1,
      size: 1,
      sort: null,
      totalElements: 1
    },
    { result: 'UNMATCHED' }
  ]
}
[2020-12-23T07:45:42.410Z] Returning : diterima
[2020-12-23T07:45:42.411Z] {
  orig: 'orig',
  origParam: { number: '123456' },
  resp: [
    {
      content: [Array],
      firstPage: true,
      lastPage: true,
      number: 0,
      numberOfElements: 1,
      size: 1,
      sort: null,
      totalElements: 1
    },
    { result: 'UNMATCHED' }
  ]
}
[2020-12-23T07:45:42.412Z] Returning : diterima
events.js:288
      throw er; // Unhandled 'error' event
      ^

Error: This socket has been ended by the other party
    at Socket.writeAfterFIN [as write] (net.js:451:14)
    at HanaconsResponded.<anonymous> (C:\Users\ralfian\--\--\--.js:47:11)
    at HanaconsResponded.emit (events.js:323:22)
    at callFunction (C:\Users\ralfian\--\--\--.js:79:23)
    at Socket.<anonymous> (C:\Users\ralfian\--\--\--.js:35:17)
    at Socket.emit (events.js:311:20)
    at addChunk (_stream_readable.js:294:12)
    at readableAddChunk (_stream_readable.js:271:13)
    at Socket.Readable.push (_stream_readable.js:209:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:186:23)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (net.js:1336:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'EPIPE'
}

и ниже ошибка на стороне клиента при втором запросе (с первым запросом проблем нет):

CLIENT: I connected to the server.
{"orig":"orig","origParam":{"number":"123456"},"resp":[{"content":[{"gender":"not match"}],"firstPage":true,"lastPage":true,"number":0,"numb
erOfElements":1,"size":1,"sort":null,"totalElements":1},{"result":"UNMATCHED"}]}
events.js:288
      throw er; // Unhandled 'error' event
      ^

Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:205:27)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ECONNRESET',
  code: 'ECONNRESET',
  syscall: 'read'
}

Вот мой код сервера:

var net = require('net');
var server = net.createServer();
require('log-timestamp');

var hostport = 4444;

var EventEmitter = require('events');
class CheckResponded extends EventEmitter {}
var checkResponded = new CheckResponded();

server.listen({
    port : hostport,
    exclusive: true

},);
console.info('server listening on ' + 'port: ' + hostport);

server.on('connection', (e) => {


    console.info( 'New Connection : ' + e.remoteAddress );
    e.setEncoding('utf8');
    e.setTimeout(60000);
    e.on('end', () => {})
    e.on( 'timeout', () => {
        console.info('Socket Timeout. Reseting.');
        e.end();
    });
    e.on( 'data', (buff) => {
        console.info("message: " + typeof buff);
        try {
            if (buff === "exec"){
                console.info("executing call function")
                callFunction()
            }
        } catch(error){
            console.info('error on socket -> ' + error)
        }
    });

    checkResponded.on( 'event1', (f) => {
        console.info(f)
        var rmsg;
        rmsg = f;
        console.info("Returning : " + 'diterima');
        e.write(JSON.stringify(rmsg));

    });

});
function callFunction() {
    console.info('oncall function')
    var imsg = {
        "orig": "orig",
        "origParam": {
            "number": "123456",
        },
        "resp": [
            {
                "content": [
                    {
                        "gender": "not match",
                    }
                ],
                "firstPage": true,
                "lastPage": true,
                "number": 0,
                "numberOfElements": 1,
                "size": 1,
                "sort": null,
                "totalElements": 1
            },
            {
                "result": "UNMATCHED"
            }
        ]
    }
    console.info('executing emit')
    checkResponded.emit('event1', imsg);
    return
}

и ниже приведен пример запроса клиента:

const net = require('net');
var host = 'localhost';

const client = net.createConnection({ port: 4444, host: host }, () => {
    console.info('CLIENT: I connected to the server.');
client.write('exec')
});
client.on('data', (data) => {
    console.info(data.toString());
    client.end();
});
client.on('end', () => {
    console.info('CLIENT: I disconnected from the server.');
});

ищу помощи, спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
903
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу одну вещь: ваш клиентский код предполагает, что весь ваш ответ поступает в одном событии data. Это не безопасное предположение. Иногда это может происходить таким образом, но это не гарантируется, и если сервер не отправляет данные при вызове client.end(), вы получите сообщение об ошибке (как и вы) на сервере, например:

Error: This socket has been ended by the other party

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

Аналогичная проблема обсуждается здесь: Обнаружение полных данных, полученных в событии «данные» в сетевом модуле Node.js

Другие вопросы по теме