Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Socket.io and modern browsers aren't working

I'm having some weird issues with socket.io and modern browsers. Surprisingly, with IE9 works fine because fallbacks to flashsocket which appears to work better.

In my server (with express)

var io = socketio.listen(server.listen(8080));
io.configure('production', function(){
    console.log("Server in production mode");
    io.enable('browser client minification');  // send minified client
    io.enable('browser client etag');          // apply etag caching logic based on version number
    io.enable('browser client gzip');          // gzip the file
    io.set('log level', 1);                    // reduce logging
    io.set('transports', [                     // enable all transports (optional if you want flashsocket)
        'websocket'
        , 'flashsocket'
        , 'htmlfile'
        , 'xhr-polling'
        , 'jsonp-polling'
    ]);
});

On the browser I can see in the Network tab (on Chrome) that a websocket is stablished and get in 101 Switching Protocols in Pending mode. After that, appears xhr-polling and jsonp-polling (what happend to flashsocket ? )

The worst part is that info don't go back and forth. I have this on connection:

io.sockets.on('connection', function (socket) {
    // If someone new comes, it will notified of the current status of the application
    console.log('Someone connected');
    app.sendCurrentStatus(socket.id);
    io.sockets.emit('currentStatus', {'connected': true);
});

And on client:

socket.on('currentStatus', function (data){ console.log(data) });

However I only be able to see that log when I turn off the server which is launched with:

NODE_ENV=production node server.js

What am I doing wrong?

like image 863
Antonio Laguna Avatar asked Jul 25 '12 12:07

Antonio Laguna


People also ask

Should I use Socket.IO or WebSockets?

Both WebSocket vs Socket.io are popular choices in the market; let us discuss some of the major Difference Between WebSocket vs Socket.io: It provides the Connection over TCP, while Socket.io is a library to abstract the WebSocket connections. WebSocket doesn't have fallback options, while Socket.io supports fallback.

What is the difference between Socket.IO and WebRTC?

WebRTC and WebSockets are powerful technologies for real-time voice and video communication, but they have slightly different use cases. While WebRTC is best suited for direct peer-to-peer communication, WebSockets is more appropriate for multi-user applications.


2 Answers

Finally, after really banging my head against a wall, I decided to test in several environments to see if it was a Firewall issue since the machine is behind several ones.

It turned out that no one but me had the problem so I checked the Antivirus (Trend Micro) and after disabling, Chrome/Firefox were able to make their magic.

Moral of the story

Besides what it says here - Socket.IO and firewall software - whenever you face an issue that nobody in the internet seems to have (ie, not logged on github nor the socket.io group) it's probably caused by your Antivirus. They are evil. Sometimes.

like image 64
Antonio Laguna Avatar answered Sep 19 '22 12:09

Antonio Laguna


You should just be having the socketio listen on the app itself.
Also, I have never need to do all of the server side configuration with the socket that you are doing - socket.io should work out of the box on most browsers without doing that. I would try first without configuring. Also, on the server, you should emit from the socket that is passed to the callback function rather than doing io.sockets.on.

var io = socketio.listen(app);

io.sockets.on('connection', function (socket) {
  // If someone new comes, it will notified of the current status of the application
  console.log('Someone connected');
  app.sendCurrentStatus(socket.id);
  socket.emit('currentStatus', {'connected': true);
});

on the client, you need to connect first:

var socket = io.connect();
socket.on('currentStatus', function (data){ console.log(data) });

If you want to see an example of two way communication using socket.io, check out my Nodio application.

The server side: https://github.com/oveddan/Nodio/blob/master/lib/Utils.js

And the client side: https://github.com/oveddan/Nodio/blob/master/public/javascripts/Instruments.js

like image 36
Oved D Avatar answered Sep 21 '22 12:09

Oved D