socket.io/node.js如何检测服务器是否宕机

12

有没有客户端可以检测到socket.io websocket不可用的方法?类似以下方式:

  • 服务器如常启动
  • 客户端连接
  • 消息在服务器和客户端之间发送
  • 服务器关闭(不再可用)
  • 警告已连接的客户端服务器不可用

我尝试在客户端添加“错误”和“连接失败”的选项,但没有成功,它们根本没有触发。有任何想法如何实现这一点吗?


3
var sio = io.connect(); sio.socket.on('error', function (reason){ console.error('无法连接Socket.IO', reason); }); - Anh Tú
是的,我尝试过了 - 这是在客户端上对吧?我也尝试了“connect_failed”,但没有成功。 - Tamas
Anh Tú的解决方案适用于客户端尝试连接到已关闭的服务器。因此,基本上需要两个脚本来覆盖所有可能的情况。 - Nasim Khamidov
4个回答

12

断开连接(disconnect)事件是您要监听的内容。

var socket = io.connect();

socket.on('connect', function () {
  alert('Socket is connected.');
});

socket.on('disconnect', function () {
  alert('Socket is disconnected.');
});

我建议也监听 connect_error 事件 由 cbautista 建议。这两个事件很有用,但如果初始连接尝试失败,它们将不会显示任何内容。 - joeytwiddle

11
如果您希望能够检测客户端无法连接到服务器的情况,请尝试使用connect_error。我在使用socket.io-1.3.5.js时可以这样做。我在https://stackoverflow.com/a/28893421/2262092中找到了这个方法。
这是我的代码片段:
var socket = io.connect('http://<ip>:<port>', {
    reconnection: false
});
socket.on('connect_error', function() {
    console.log('Failed to connect to server');
});

0

connect_error 对我没有用(使用 Apache ProxyPass 并返回 503)。

如果您需要检测初始连接失败,可以这样做。

var socket;
try {
    socket = io();
}
catch(e) {
    window.location = "nodeServerDown.php";
}

当服务器宕机时,将用户重定向到自定义错误页面。

如果您需要在连接一次后处理断开连接。

您可以这样做:

socket.on('disconnect', function() {
    //whatever your disconnect logic is
});

0
在我的开发过程中遇到了这个错误,并注意到每次重置服务器时我的事件调用都会加倍,因为我的套接字重新连接。结果证明对我有效的解决方案不是复制连接,而是这个:
var socket = io.connect();
socket.on('connect', function () {
console.log('用户已连接!');
});
socket.on('message', function(message) {

console.log(message);

});

( 在https://github.com/socketio/socket.io/issues/430中发现,作者是KasperTidemann )

结果是,问题是因为我把'message'监听器放在了'connect'函数里。将其放到监听器外部解决了这个问题。

向Kasper Tidemann干杯,无论你在哪里。

接着往下做吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接