node.js net.Socket socket.write()错误处理

时间:2017-10-27 23:21:31

标签: javascript sockets

我想知道在net.Socket()上使用socket.write()发送数据时是否可以检测到服务器是否处于脱机状态。我会假设在尝试写入断开连接的服务器的套接字后会触发错误事件或超时事件,但我无法使其工作。它只是触发socket.write并没有任何反应。这是一些示例代码。

try {
    socket = new net.Socket();
    socket.connect(data.port, data.address);
} catch (error) {
    console.log(error);
}

socket.on('connect', function() {
    interval = setInterval(function() {
        socket.write('sending message');
    }, 1000);
});

socket.on('error', function(error) {
    clearInterval(interval);
    socket.destroy();
    socket.unref();
    console.log(error);
});

[编辑1]

一个肮脏的解决方案将是以下代码,但这感觉不对。它在写入套接字时设置定时器。如果收到数据,则取消定时器(在写入套接字后,我的情况就是这种情况)。如果没有取消定时器,套接字将被销毁。

try {
    socket = new net.Socket();
    socket.connect(data.port, data.address);
} catch (error) {
    console.log(error);
}

socket.on('connect', () => {
    interval = setInterval(function() {
        socket.write('sending message', () => {
            timeout = setTimeout(() => {
                socket.destroy();
                socket.unref();
            }, 4000);
        });
    }, 5000);
});

socket.on('error', (error) => {
    clearInterval(interval);
    socket.destroy();
    socket.unref();
    console.log(error);
});

socket.on('data', (message, address) => {
    clearTimeout(timeout);
})

1 个答案:

答案 0 :(得分:0)

您只能通过收听超时事件socket timeOut来检测此情况 您可以像这样在套接字上设置超时,

socket.setTimeout(3000);
  

默认情况下,net.Socket没有超时。