Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Socket.io connection reverts to polling, never fires the 'connection' handler

Tags:

I'm trying to add socket.io to my existing node.js app on express. I've added the socket.io library in the server-side as follows (directly following http://socket.io/get-started/chat/):

var express = require('express')     , http = require('http')     , path = require('path')     , fs = require('fs');  var app = express(); var http = http.Server(app); var io = require('socket.io')(http);  // Express settings [...] // Express routes [...]  // Socket.io Communication io.on('connection', function(socket) {   console.log('a user connected'); });   // Start server app.listen(config.port, function () {   console.log('Express server listening on port %d in %s mode', config.port, app.get('env')); }); 

Right now, on the front-end I am simply making a connection:

<script src="/socket.io/socket.io.js"></script> <script>   var io = io(); </script> 

But instead of showing "a user connected" in the console, the console logs a continuous stream of polls. I am using the latest version of Chrome on Mac, which supports websockets.

GET /socket.io/?EIO=2&transport=polling&t=1402521519446-91 200 94ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519447-92 200 93ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519485-93 200 53ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519580-94 200 143ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519582-95 200 144ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519633-96 200 40ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519778-97 200 92ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519780-98 200 92ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519818-99 200 36ms - 6.96kb GET /socket.io/?EIO=2&transport=polling&t=1402521519912-100 200 81ms - 6.96kb [etc] 

I must be doing something wrong. I'm pretty new to this, and I'd love to be pointed in the right direction. Let me know if I need to elaborate on any part of this question.

Thanks! - Edward

===========

EDIT:

Here's the express settings I'm currently using. I tried the same steps on a completely new node app and it seemed to work fine, so I'm wondering if any of this might be the issue.

app.configure('development', function(){     app.use(require('connect-livereload')());      // Disable caching of scripts for easier testing     app.use(function noCache(req, res, next) {         if (req.url.indexOf('/scripts/') === 0) {             res.header('Cache-Control', 'no-cache, no-store, must-revalidate');             res.header('Pragma', 'no-cache');             res.header('Expires', 0);         }         next();     });      app.use(express.bodyParser({limit: '50mb'})); // increase limit for audio recordings     app.use(express.static(path.join(config.root, '.tmp')));     app.use(express.static(path.join(config.root, 'app')));     app.use(express.errorHandler());     app.use(express.logger('dev'));      util.logger.add(loggly, {          [...Credentials...]     });     app.set('views', config.root + '/app/views'); }); 
like image 504
Edward Sun Avatar asked Jun 11 '14 21:06

Edward Sun


People also ask

Does Socket.IO use polling?

First, Socket.IO creates a long-polling connection using xhr-polling. Then, once this is established, it upgrades to the best connection method available. In most cases, this will result in a WebSocket connection.

How many concurrent connections can Socket.IO handle?

Once you reboot your machine, you will now be able to happily go to 55k concurrent connections (per incoming IP).

How do I secure a Socket.IO connection?

All you have to do is updating the remote session store on node server when a new login/logout happens in your php server. Show activity on this post. The excellent passport framework for express uses secure cookies to validate identity. There is even a module to access it from socket.io.


1 Answers

I had the same problem and the way how I solved it was by replacing this

// Start server app.listen(config.port, function () {     console.log('Express server listening on port %d in %s mode', config.port, app.get('env')); }); 

with this:

// Start server http.listen(config.port, function () {     console.log('Express server listening on port %d in %s mode', config.port, app.get('env')); }); 

This post kinda explains why: https://stackoverflow.com/a/17697134/1515130

like image 104
Toni Avatar answered Nov 09 '22 08:11

Toni