Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

socket.io - works first time, not second time onwards

When I start my node.js server and client gets connected, I am able to send a request from client (socket.emit) and get a response (socket.on('rentsAround'....)). But when I connect 2nd time onwards, the client is able to send, but server can not send or emit. So I have to restart the server again. I understand that it is working as expected, but somehow my understanding is wrong somewhere... Would someone please point out.

client side: ========

    var socket = new io.Socket();
    socket = io.connect();

    socket.on('rentsAround', function(data){
        registration.handleRentsAround(data);
    });


    socket.on('locationDetailsRes', function(data){
        registration.handleRentsAround(data);
    });

    socket.on('connect', function(data){
        alert('inside connect on client side');
    });

socket.on('disconnect', function(){ 
    // do something, if you want to. 
    });
    .............
    socket.emit("searchRent",  {"lat":lat, "lng":lng});

server side: ========

socket.sockets.on('connection', function(client){ 

            client.on('searchRent', function(msg){
        console.log('inside on connection');
                // do something and reply back
        client.emit('rentsAround',{"totalRents":docs.length, "rents":docs});
            });

   client.on('disconnect', function(){ 
        sys.puts("client disconnect"); 
        mongoose.disconnect();
        }); 
like image 286
user644745 Avatar asked Sep 21 '11 12:09

user644745


People also ask

Does Socket.IO disconnect after some time?

Yep, I've had same issue actually. But I managed to solve it differently. There was no issue on code side, it was sever configuration issue where it was hosted.

How many messages per second can Socket.IO handle?

Load benchmarks Here we can see that the HTTP benchmark peaks at about~950 requests per second while Socket.io serves about ~3900 requests per second.

Does Socket.IO reconnect automatically?

In the first case, the Socket will automatically try to reconnect, after a given delay.

How many connection can Socket.IO handle?

As we saw in the performance section of this article, a Socket.IO server can sustain 10,000 concurrent connections.


3 Answers

Socket.io 0.7 onwards will try and reuse connections to the same host. In my experience I've found this behaviour can be a little flakey.

I can't tell from the small code sample you provided, but I suspect the problem is that the second call to connect() is trying to reuse the first (closed) connection.

The workaround is to pass the 'force new connection' option when you call connect(). Eg:

io.connect("http://localhost", {'force new connection': true});

like image 189
Joseph Avatar answered Nov 07 '22 15:11

Joseph


Your second line discards the object created in the first line. Simply doing this should work:

var socket = io.connect();

The problem with first send and second fail could be due to browser/protocol. I have seen such behaviour with Internet Explorer and XHR transport, and also with Opera using JSONP.

If you are using IE, try switching to JSONP and it should work properly. This can be done on the server side, by supplying the transport list to configuration. Just make sure JSONP comes before XHR. Something like this:

sio.set('transports', [
    'websocket'
    , 'flashsocket'
    , 'jsonp-polling'
    , 'xhr-polling'
    , 'htmlfile'
]);
like image 45
Milan Babuškov Avatar answered Nov 07 '22 15:11

Milan Babuškov


As of socket.io 1.0, two settings control this behaviour:

  • "force new connection":true, on the client connect() call.

  • "cookie":false, on the server Server() constructor.

Apparently, both produce the exact same behaviour.

The second method is, as of today, undocumented. However, looking at the source code you can see that all options passed to socket.io Server() are passed to the internal Engine.io library Server() constructor, which lets you change any of the options there. These options are documented here:

https://github.com/LearnBoost/engine.io

like image 39
bluehallu Avatar answered Nov 07 '22 16:11

bluehallu