сокет.write() приводит к преждевременному завершению моего соединения

#javascript #node.js #sockets #logging #tcp

#javascript #node.js #сокеты #ведение журнала #tcp

Вопрос:

Итак, я работаю над некоторым кодом, который подключается к серверу журналов и отправляет сообщения в определенном формате. Я создаю сокет, передаю номер хоста и порта, а затем мой клиент успешно подключается. Я знаю это, потому что событие connect выполняет свой обратный вызов. Однако, когда я пытаюсь выполнить запись в сокет, соединение разрывается. Есть идеи, что может быть причиной этого?

вот фрагмент того, что я делаю.

 function Harvester(options){
  const socket = new net.Socket();
  socket.connect({port:options.port, host:options.host}, ()=>{
    socket.write(` node|${options.node}rn`);
  });
  socket.on('connect', (socket) => console.log('Connected to Log Harvester!'));
  socket.on('data', (data) => console.log('Message from Logio Server: ', data));
  socket.on('error', (error) => console.log('Error from Logio Server: ', error.message));
  socket.on('close', (error) => {
    console.log(!error ? 'Client connection closed' : 'Client connection closed with Error');
  });
  socket.on('end', () => console.log('Logio Connection Ended'));

  return {
    /**
     * Writes log to tcp socket
     * @param node
     * @param stream
     * @param level
     * @param message
     */
    log: (level, stream, message, done) => {
      socket.write(` log|${stream}|${options.node}|${level}|${JSON.stringify(message)}n`, function(err){
        if(err){ throw err }
        socket.end();
      });
      done(null, true);
    }
  }
}
 

сервер отклоняет мое соединение? Нужно ли мне каким-то образом поддерживать соединение?

Комментарии:

1. Какую ошибку вы видите в коде при записи в сокет?

2. @Prabhu Ошибок нет. Просто клиентское соединение завершилось нормально. Кроме socket.on('close') того, обратный вызов также возвращает свой has_error аргумент как falsew, что означает, что он закрывается соответствующим образом. Я видел несколько других примеров в Интернете, и, похоже, мне нужно реализовать какую-то логику повторного подключения для события закрытия, что, должен сказать, кажется очень странным.

3. можете ли вы проверить, кто закрывает сокет? Получите tcpdump. Это укажет вам правильное направление

4. Спасибо @Prabhu Нашел проблему. я сам закрывал сокет с помощью socket.end в сокете. напишите обратный вызов, который я не должен делать.