2012-04-17 23 views
10

He estado mirando ejemplos de node.js y socket.io toda la tarde y estoy tratando de armar una página simple que me dirá cuántos usuarios he conectado al servidor.nodejs socket.io no se puede conectar al servidor?

He leído la documentación en http://socket.io/, así como algunos tutoriales/preguntas aquí que describen exactamente lo que estoy tratando de hacer. También encontré create simple node js server and client que no me ayuda.

Información de la versión:

Node.js - 0.6.15
expreso - 3.0.0alpha1
socket.io - 0.9.5 (socket.io-cliente es la misma versión, sin embargo no lo hace encontrar los recursos ... ver comentarios)
ejs - 0.7.1

Aquí está mi código de servidor:

var express = require('express'), 
    config = { 
     port: 4000, 
     hostname: 'localhost' 
    }; 

var server = module.exports = express.createServer(); 
    /* server configuration */ 
    server.use(express.cookieParser('keyboard unicorn')); 
    server.use(express.bodyParser()); 
    server.use(express.methodOverride()); 
    server.use(express.session({ secret: 'keyboard unicorn' })); 
    server.engine('.html', require('ejs').__express); 
    server.set('views', __dirname + '/lib/views'); 
    server.set('view options', { layout: false }); 
    server.set('view engine', 'html'); 
    server.use(server.router); 
    server.use('/', express.static(__dirname + '/lib/assets')); 

var io = require('socket.io').listen(server); 

var connections = { 'length': 0 }; 

io.sockets.on('connection', function(socket) { 
    socket.__fd = socket.fd; 
    connections[socket.__fd]=socket.remoteAddress; 
    ++connections.length; 
    console.log('user connected! There are a total of ' + connections.length + ' users online.'); 
    return socket.on('disconnect',function(){ 
     delete conns[socket.__fd]; 
     --connections.length; 
     console.log('user disconnected! There are a total of ' + connections.length + ' users remaining online.'); 
    }); 
}); 

server.get('/', function(req, res) { 
    res.render('index', { 
     'page_title': 'sample application', 
     'number_of_connections': connections.length 
    }); 
}); 

server.listen(config.port, config.hostname); 

Aquí está mi código de cliente:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title><%= page_title %></title> 
</head> 
<body> 
<div>There is a total of <%= number_of_connections %> user(s) connected.</div> 
<script src="http://cdn.socket.io/stable/socket.io.js"></script> 
<script type="text/javascript"> 
var socket = new io.Socket('localhost',{'port':4000}); 
socket.connect(); 
socket.on('connect', function() { 
    console.log('connected'); 
}); 
</script> 
</body> 
</html> 

Esto es lo que sucede cuando corro el servidor y conectar con el cliente.

$ node server.js 
    info - socket.io started 

luego, cuando me vaya a localhost: 4000 en mi navegador web llego a la página con '0' (number_of_connections). Además, no veo nada en el terminal para el servidor (el encendido. ('Conexión' nunca se golpea).

En el cliente, después de un segundo o dos, comienzo a obtener una gran cantidad de errores (si dejar la consola abierta durante unos segundos se bloquea la página) véase más adelante la imagen:

enter image description here

por favor, cualquier ayuda con dónde empezar para depurar este sería apreciada sólo quiero conseguir este ejemplo básico hasta y ejecutándose para que pueda comenzar a jugar con/understanding nodejs y socket.io!

+0

Un buen lugar para comenzar sería la versión de su nodo y la versión de socket.io. Veo la versión de cdn.socket.io en 0.6. Veo que estoy usando socket.io 0.8.7 con el nodo v0.6.4, por ejemplo. Además, ¿hay alguna razón por la que no acaba de ir con ''? Puede intentarlo y ver si el resultado es diferente (ya que eso evitaría la posibilidad de errores de versión) – Kato

+0

'Error al cargar el recurso: el servidor respondió con un estado de 404 (No encontrado) http: // localhost: 4000/socket.io/socket.io.js' – rlemon

+0

Hm, eso es extraño. La mía funciona de inmediato, por supuesto, así que no puedo ser de mucha ayuda sobre por qué no puedes usar la URL local de socket.io. Por cierto, mi versión socket.io-client es 0.8.7 (lo mismo que socket.io) - me pregunto si eso importa ... – Kato

Respuesta

14

El problema se debe a que Express ahora es una función.

que tiene que hacer lo siguiente:

var express = require('express'); 
var app = express(); 
var server = app.listen(3000); 

var io = require('socket.io').listen(server); 
+0

@Linus G. Thiel me indicó la respuesta correcta, y creo que @tehlulz tropezó con la respuesta correcta, pero dio la razón equivocada. Me referiré al código de @ tehlulz en este comentario. Parece que en Express 3.0.x, la aplicación en sí misma, ya sea creada con 'express.createServer()' o 'express()', no contiene suficiente información para permitir que Socket.IO la escuche directamente. Más bien, es el valor de retorno de 'app.listen (PORT)' que es lo que Socket.IO debería estar escuchando, no 'app' en sí mismo. – btown

+0

Tenía exactamente el mismo problema y esta solución funcionó para mí. +1 para la gran respuesta – lhk

+1

Lástima que esto no está marcado como la respuesta. Así es como obtener Express 3.0 para que funcione con socket.io – Benny

4

Express 3.0.0alpha y socket .io no son (directamente) compatibles, debido a cambios en Express entre 2. * y 3. * (o más bien, cambios en Connect entre 1. * y 2. *). Por el momento, le recomendaría degradarse a Express 2.5.9 o puede seguir this advice del autor de Express, TJ Holowaychuk.

+0

genial. Voy a intentar esto, muchas gracias. – rlemon

4

Configuré un entorno de prueba, instalé Express 3.0 y socket.io 0.9.5, y reproduje su error.

Luego ejecuté npm install [email protected] hizo un par de ajustes hacia atrás basados ​​en el migration guide, y funcionó muy bien.

Así que voy a seguir adelante y sugiero que socket.io probablemente aún no sea compatible con Express 3, que todavía se ve bastante inestable.

Mis app.js pellizcadas por expreso 2:

var express = require('express'), 
    config = { 
    port: 8080, 
    hostname: 'localhost' 
}; 

var server = module.exports = express.createServer(); 
/* server configuration */ 
server.set('views', __dirname + '/lib/views'); 
server.set('view options', { layout: false }); 
server.set('view engine', 'ejs'); 
//server.register('.html', 'ejs');require('ejs').__express); 
server.use(express.cookieParser('keyboard unicorn')); 
server.use(express.bodyParser()); 
server.use(express.methodOverride()); 
server.use(express.session({ secret: 'keyboard unicorn' })); 
server.use('/', express.static(__dirname + '/lib/assets')); 
server.use(server.router); 

var io = require('socket.io').listen(server); 

io.set('log level', 2); 

var connections = { 'length': 0 }; 

server.get('/', function(req, res) { 
     res.render('index', { 
       'page_title': 'sample application', 
        'number_of_connections': connections.length 
        }); 
    }); 

io.sockets.on('connection', function(socket) { 
     socket.__fd = socket.fd; 
     connections[socket.__fd]=socket.remoteAddress; 
     ++connections.length; 
     console.log('user connected! There are a total of ' + connections.length + ' users online.'); 
     return socket.on('disconnect',function(){ 
       delete conns[socket.__fd]; 
       --connections.length; 
       console.log('user disconnected! There are a total of ' + connections.length + ' users remaining online.'); 
      }); 
    }); 

server.listen(config.port); 

mi índice.archivo ejs:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title><%= page_title %></title> 
</head> 
<body> 
<div>There is a total of <%= number_of_connections %> user(s) connected.</div> 
<!--<script src="http://cdn.socket.io/stable/socket.io.js"></script>--> 
<script src='/socket.io/socket.io.js'></script> 
<script type="text/javascript"> 
    var socket = io.connect('http://hostname.com:8080'); 
    socket.on('connect', function() { 
     console.log('connected'); 
    }); 
</script> 
</body> 
</html> 

Espero que algo aquí ayude.

+0

guau, respuesta increíblemente útil. ¡Ojalá pudiera haberte votado dos veces! Cambiaré mi instalación y espero que esto también corrija el problema. – rlemon

+0

He hecho el cambio que sugirió y modifiqué un poco mi aplicación para que sea compatible con la versión anterior ... ahora recibo 'advertir - transporte desconocido:" indefinido "\ n información - socket.io no usado url' – rlemon

+0

s/\ n/salto de línea – rlemon

0

reemplazar app.use(express.bodyParser());, con

app.use(express.json()); 
app.use(express.urlencoded()); 

... guardar el archivo, reinicie el servidor de nodo.

Cuestiones relacionadas