【问题标题】:node.js net.Socket socket.write() error handlingnode.js net.Socket socket.write() 错误处理
【发布时间】:2017-10-27 23:21:30
【问题描述】:

我想知道在 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]

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

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);
})

【问题讨论】:

  • 因为关闭事件没有触发。
  • 我已经用一个肮脏的变通方法解决了我的问题。不过感觉不对。

标签: javascript sockets


【解决方案1】:

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

socket.setTimeout(3000);

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

【讨论】:

  • Socket.write() 似乎取消了超时,即使服务器已离线,因此永远不会触发超时事件。
猜你喜欢
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多