#javascript #node.js #pm2
#javascript #node.js #pm2
Вопрос:
Я едва задаю какие-либо вопросы о переполнении стека, но это выше моего понимания. Я предполагаю, что мне не хватает чего-то основного, поскольку я довольно новичок в Node server.
Наше приложение довольно простое. Предполагается, что сервер получит несколько текстовых строк (данных), объединит и проанализирует их, и как только соединение будет закрыто (отправка данных завершена), он отправляет данные в api.
var net = require('net');
var fs = require('fs');
const axios = require('axios')
const server = new net.Server();
server.listen(PORT, IP);
server.on("connection", client => {
client.write("Hellon");
console.log('connected');
let received = "";
client.on("data", data => {
received = data
console.log("Partial data is: " data);
});
client.on("close", () => {
received = received.toString('utf8');
fs.appendFile('log.txt', received, function (err) {});
received = received.replace(/(?:rn|r|n)/g, "||");
axios.post(APIADDRESS, {data: received});
console.log('Full data is: ' {data: received});
});
});
Для отправки данных я просто запускаю netcat
или nc
использую netcat ipaddress port
, это не проблема. Подключение выполнено нормально, получено сообщение о состоянии.
Дело в том, что как только я открываю два или более соединения с двух РАЗНЫХ SSh-серверов, происходит что-то странное. Я могу отправлять строку за строкой просто отлично. Сервер без проблем сообщает об отладке «частичных данных» для них обоих. Однако, как только я закрываю одно из соединений (ctrl c), они ОБА закрываются. В итоге принимаются только данные из закрытого вручную соединения. Похоже, другой, с отдельного nc
на отдельном ssh-сервере, никогда не достигает client.on("close")
части. Это просто прекращается без причины.
Есть идеи? Я даже не знаю, с чего начать.
// EDIT Только что протестировал его с моего компьютера и с какого-то мобильного приложения ssh, используя отдельные серверы SSH. Как только ctrl c отправляется на любое устройство, оно закрывает соединение для всех клиентов.
// Забыл упомянуть, что я использую pm2 для поддержания работоспособности сервера. Как только я включил скрипт вручную, игнорируя pm2 — он работает нормально. Странно. Это происходит из-за PM2.
Комментарии:
1. Что именно представляет собой командную строку netcat, которую вы используете? И вы делаете это с двух отдельных компьютеров? Или две отдельные консоли на одном компьютере? И откуда вы нажимаете Ctrl-C?
2. Я запускаю putty, 2 экземпляра разных ssh-серверов (открыто два окна), но на одном компьютере. Я просто делаю ctrl-c в одной из консолей.
3. Есть идеи, если putty каким-то образом разделяет соединения между экземплярами? Возможно, прочитайте это: совместное использование соединений с Putty
Ответ №1:
Я бы предположил, что у вас Putty настроен на «совместное использование SSH-соединений, если это возможно». Согласно некоторому документу, при этом:
Когда используется этот режим, первый PuTTY, подключенный к данному серверу, становится «восходящим», что означает, что он управляет реальным SSH-соединением. Все последующие PUTTYS, которые повторно используют соединение, называются «нисходящими потоками»: они вообще не подключаются к реальному серверу, а вместо этого подключаются к вышестоящему PuTTY через локальные методы межпроцессной связи.
Итак, если вы нажмете Ctrl C на сеанс PuTTY, который управляет фактическим общим соединением, они оба потеряют свое соединение.
Предположительно, вы могли бы отключить эту функцию общего подключения либо на стороне клиента, либо на сервере, поскольку оба должны быть включены для совместного использования.
Комментарии:
1. Однако, как я уже сказал, это два полностью разделяемых ssh-сервера, для которых я использую
netcat
. Это то, что беспокоит меня больше всего. Я думаю, мне нужно будет протестировать его на двух устройствах одновременно, просто чтобы быть уверенным.2. Нет, только что протестировал его с моего компьютера и с какого-то мобильного приложения ssh. Как только ctrl c отправляется на любое устройство, оно закрывает соединение для всех клиентов.
Ответ №2:
Всем, кто придет сюда в будущем.
Если вы используете pm2 с включенным —watch и текстовый файл журнала находится в той же папке, что и ваш основной серверный скрипт… Именно по этой причине он прерывает соединение после отключения одного клиента. Он просто обнаруживает, что журнал изменился.
Я не фейспалминг, это даже не смешно.
Комментарии:
1. Итак, pm2 перезапускает ваш сервер при изменении файла журнала SSH? Вы хотите сказать, что это причина вашей проблемы?