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
===========
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'); });
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.
Once you reboot your machine, you will now be able to happily go to 55k concurrent connections (per incoming IP).
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With