最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - SockJS Client auto reconnect? - Stack Overflow

programmeradmin3浏览0评论

I'm trying to figure out a way for my SockJS clients to reconnect to the server if it should go down.

I currently have this:

    new_conn = function() {    
        socket = new SockJS(protocol + serverDomain + '/echo', null, {
            'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling']
        });
    };

    socket.onopen = function () {
        clearInterval(recInterval);
    };  

    socket.onclose = function () {    
        recInterval = window.setInterval(function () {
            new_conn();
        }, 2000);
    }; 

The problem is that the setInterval keeps firing even after a successful reconnect. It seems that the socket.onopen never gets executed.

Any ideas what I could be doing wrong?

I'm trying to figure out a way for my SockJS clients to reconnect to the server if it should go down.

I currently have this:

    new_conn = function() {    
        socket = new SockJS(protocol + serverDomain + '/echo', null, {
            'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling']
        });
    };

    socket.onopen = function () {
        clearInterval(recInterval);
    };  

    socket.onclose = function () {    
        recInterval = window.setInterval(function () {
            new_conn();
        }, 2000);
    }; 

The problem is that the setInterval keeps firing even after a successful reconnect. It seems that the socket.onopen never gets executed.

Any ideas what I could be doing wrong?

Share Improve this question edited Jun 18, 2014 at 12:38 franzlorenzon 5,9436 gold badges37 silver badges58 bronze badges asked Sep 21, 2013 at 8:57 AlosyiusAlosyius 9,11126 gold badges78 silver badges121 bronze badges 3
  • 3 in your case, using setTimeout() should be better than setInterval() – lance34 Commented Nov 10, 2013 at 0:21
  • @Fielding34 Actually I think it's quite the opposite - setInterval() is better because OP wants to keep trying (while server is down) until it connects – TMG Commented Jan 2, 2016 at 2:23
  • @TMG The close event will actually be fired if a connection is attempted when the server is down, so a single setTimeout() is all that is necessary. – Herohtar Commented Apr 6, 2021 at 21:14
Add a comment  | 

2 Answers 2

Reset to default 10

I think it could be related to variable scoping. Try this:

var recInterval = null;

new_conn = function() {    
    socket = new SockJS(protocol + serverDomain + '/echo', null, {
        'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 'iframe-eventsource', 'iframe-htmlfile', 'xdr-polling', 'xhr-polling', 'iframe-xhr-polling', 'jsonp-polling']
    });
};

socket.onopen = function () {
    clearInterval(recInterval);
};  

socket.onclose = function () {    
    recInterval = window.setInterval(function () {
        new_conn();
    }, 2000);
}; 

Anyway, it's strange, because you were declaring recInterval on the window object, and it should have worked. If it doesn't work, you could also debug it with a browser, with debugger; statements or interactively by setting local breakpoints... (in onopen, for example).

By the way, I rewrited the whole code like this (I like refactoring:):

var recInterval = null;
var socket = null;

var new_conn = function() {    
    socket = new SockJS(protocol + serverDomain + '/echo', null, {
        'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming', 
                                'iframe-eventsource', 'iframe-htmlfile', 
                                'xdr-polling', 'xhr-polling', 'iframe-xhr-polling',
                                'jsonp-polling']
    });

    socket.onopen = function () {
        clearInterval(recInterval);
    };  

    socket.onclose = function () {    
        recInterval = setInterval(function () {
            new_conn();
        }, 2000);
    };
};

In case anyone still interested in this topic: The refactored code snippet from franzlorenzon causes a lot of reconnects since it is kind of recursive reconnecting itself somehow since each two seconds a new onclose event is spawned (regardless of the recInterval).

Moving the clear interval right after the socket creation does the trick. I also added a socket = null in the onclose event.

var recInterval = null;
var socket = null;

var new_conn = function() {
  socket = new SockJS(protocol + serverDomain + '/echo', null, {
    'protocols_whitelist': ['websocket', 'xdr-streaming', 'xhr-streaming',
      'iframe-eventsource', 'iframe-htmlfile',
      'xdr-polling', 'xhr-polling', 'iframe-xhr-polling',
      'jsonp-polling'
    ]
  });

  clearInterval(recInterval);

  socket.onopen = function() {

  };

  socket.onclose = function() {
    socket = null;
    recInterval = setInterval(function() {
      new_conn();
    }, 2000);
  };
};

发布评论

评论列表(0)

  1. 暂无评论