我正在使用node.js和socket.io构建一个小型原型。一切都运行良好,我面临的唯一问题是我的node.js连接将断开连接,我不得不刷新页面以便连接并再次运行。
有没有办法在断开事件被触发后立即重新建立连接?
据我所知,这是一个常见问题。所以,我正在寻找解决这个问题的最佳实践方法:)
非常感谢, 丹
答案 0 :(得分:90)
编辑:socket.io现在有built-in reconnection support。使用它。
e.g。 (这些是默认值):
io.connect('http://localhost', {
'reconnection': true,
'reconnectionDelay': 500,
'reconnectionAttempts': 10
});
这就是我所做的:
socket.on('disconnect', function () {
console.log('reconnecting...')
socket.connect()
})
socket.on('connect_failed', function () {
console.log('connection failed. reconnecting...')
socket.connect()
})
虽然我只是在websocket传输上测试过,但似乎工作得很好。
答案 1 :(得分:19)
编辑:Socket.io现在已内置支持
当我使用socket.io时,没有发生断开连接(仅当我手动关闭服务器时)。但是你可以重新连接,例如在失败时说出10秒或断开连接事件。
socket.on('disconnect', function(){
// reconnect
});
我想出了以下实现:
客户端javascript
var connected = false;
const RETRY_INTERVAL = 10000;
var timeout;
socket.on('connect', function() {
connected = true;
clearTimeout(timeout);
socket.send({'subscribe': 'schaftenaar'});
content.html("<b>Connected to server.</b>");
});
socket.on('disconnect', function() {
connected = false;
console.log('disconnected');
content.html("<b>Disconnected! Trying to automatically to reconnect in " +
RETRY_INTERVAL/1000 + " seconds.</b>");
retryConnectOnFailure(RETRY_INTERVAL);
});
var retryConnectOnFailure = function(retryInMilliseconds) {
setTimeout(function() {
if (!connected) {
$.get('/ping', function(data) {
connected = true;
window.location.href = unescape(window.location.pathname);
});
retryConnectOnFailure(retryInMilliseconds);
}
}, retryInMilliseconds);
}
// start connection
socket.connect();
retryConnectOnFailure(RETRY_INTERVAL);
serverside(node.js):
// express route to ping server.
app.get('/ping', function(req, res) {
res.send('pong');
});
答案 2 :(得分:4)
如果第一次连接尝试失败, socket.io 0.9.16 由于某种原因不会尝试重新连接。这就是我解决这个问题的方法。
//if this fails, socket.io gives up
var socket = io.connect();
//tell socket.io to never give up :)
socket.on('error', function(){
socket.socket.reconnect();
});
答案 3 :(得分:1)
我知道这有一个可接受的答案,但我一直在寻找我正在寻找的东西,并认为这可能有助于其他人。
如果你想让你的客户尝试重新连接无限(我需要这个项目,连接的客户端很少,但是如果我把服务器关闭,我需要它们总是重新连接)。
var max_socket_reconnects = 6;
var socket = io.connect('http://foo.bar',{
'max reconnection attempts' : max_socket_reconnects
});
socket.on("reconnecting", function(delay, attempt) {
if (attempt === max_socket_reconnects) {
setTimeout(function(){ socket.socket.reconnect(); }, 5000);
return console.log("Failed to reconnect. Lets try that again in 5 seconds.");
}
});