переподключение сетевого клиентского сокета nodejs

#javascript #node.js #sockets #client

#javascript #node.js #сокеты #клиент

Вопрос:

 var socket = new net.Socket();
socket.connect(PORT, HOST, function() {
    console.log("SOCKET CONNECTED TO: "   HOST   ":"   PORT);
    socket.write("Hello World!");
});
socket.on("error", function() {}); // need this line so it wont throw exception

// Add a "close" event handler for the client socket
socket.on("close", function() {
    console.log("Connection lost. How do I reconnect? setTimeout?");
});
  

Как мне переподключиться после сбоя? Теперь, если соединение не выполнено успешно, все останавливается..

Я пытался использовать setTimeout в событии закрытия, но затем, когда сокет подключается, событие «connect» запускается несколько раз..

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

1. Предположительно, вы создаете новый объект сокета точно так же, как и первый. Вы не можете переподключить существующий — это просто не имеет смысла концептуально.

2. Но затем я теряю все события, связанные с этим объектом сокета .. т.е. socket.on (‘data’), я должен заново связать все это, я надеялся, что есть лучший способ..

Ответ №1:

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

 function connect() {
    var socket = new net.Socket();
        socket.connect(PORT, HOST, function() {
            console.log('SCOEKT CONNECTED TO: '   HOST   ':'   PORT);
            socket.write('Hello World!');
        });

    socket.on('error', function() {}); // need this line so it wont throw exception

    // Add a 'close' event handler for the client socket
    socket.on('close', function() {
        connect();
    });
}
connect();
  

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

1. Таким образом, мне придется поместить весь мой код, связанный с сокетом, например .on (‘data’), внутри функции connect?

2. Вы могли бы написать вызываемую, например, функцию handleData , которая находится за пределами connect функции и вставлена socket.on('data', handleData); connect , это не проблема.

3. Хорошо, этого достаточно, я надеялся, что есть что-то вроде сокета. переподключение, но я справлюсь с этим