2012-04-17 30 views
10

Ho osservato gli esempi node.js e socket.io per tutto il pomeriggio e sto provando a mettere insieme una semplice pagina che mi dirà quanti utenti ho collegato al server.nodejs socket.io non può connettersi al server?

Ho letto la documentazione allo http://socket.io/ e alcuni tutorial/domande che descrivono esattamente ciò che sto cercando di fare. Ho anche trovato create simple node js server and client che non mi aiuta.

Informazioni sulla versione:

node.js - 0.6.15
express - 3.0.0alpha1
socket.io - 0.9.5 (socket.io-cliente è la stessa versione, tuttavia, non lo fa trovare la risorsa ... vedi commenti)
ejs - 0.7.1

Ecco il mio codice del server:

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); 

Ecco il mio codice 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> 

Ecco cosa sta succedendo quando ho eseguito il server, e connettersi con il cliente.

$ node server.js 
    info - socket.io started 

poi quando naviga verso localhost: 4000 con il mio browser web ottengo la pagina con '0' (number_of_connections). Inoltre, non vedo nulla nel terminale per il server (l'on. (La "connessione" non viene mai colpita)

Sul client, dopo un secondo o due, comincio a ottenere un numero enorme di errori (se io lasciare la console aperta per alcuni secondi si blocca pagina) vedi immagine qui sotto:!

enter image description here

prega, di aiuto con dove cominciare per il debug di questo sarebbe apprezzato voglio solo ottenere questo esempio di base su e in esecuzione in modo da poter iniziare a giocare con/capire nodejs e socket.io!

+0

Un buon punto di partenza sarebbe la versione del nodo e la versione socket.io. Vedo quella versione di cdn.socket.io in 0.6. Vedo che sto usando socket.io 0.8.7 con il nodo v0.6.4, per esempio. Inoltre, c'è una ragione per cui non sei andato con ''? Potresti provare e vedere se il risultato è diverso (in quanto ciò ignorerebbe la possibilità di errori di versione) – Kato

+0

'Impossibile caricare la risorsa: il server ha risposto con uno stato di 404 (non trovato) http: // localhost: 4000/socket.io/socket.io.js' – rlemon

+0

Hm, è strano. Il mio funziona fuori dagli schemi, ovviamente, quindi non posso essere di grande aiuto sul motivo per cui non è possibile utilizzare l'URL socket.io locale. A proposito, la mia versione di socket.io-client è 0.8.7 (lo stesso di socket.io) - mi chiedo se questo è importante ... – Kato

risposta

14

Il problema è dovuto al fatto che Express è ora una funzione.

È necessario effettuare le seguenti operazioni:

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

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

@Linus G. Thiel mi ha indirizzato alla risposta corretta, e credo che @tehlulz abbia imbattuto la risposta corretta, ma ha fornito il motivo sbagliato. Mi riferirò al codice di @ tehlulz in questo commento. Sembra che in Express 3.0.x, l'app stessa, sia che sia stata creata con 'express.createServer()' o 'express()', non contiene informazioni sufficienti per consentire a Socket.IO di ascoltarlo direttamente. Piuttosto, è il valore di ritorno di 'app.listen (PORT)' che è ciò che Socket.IO dovrebbe ascoltare, non 'app' stessa. – btown

+0

Ho avuto esattamente lo stesso problema e questa soluzione ha funzionato per me. +1 per l'ottima risposta – lhk

+1

Peccato che questa non sia contrassegnata come risposta. Ecco come ottenere Express 3.0 per lavorare con socket.io – Benny

4

Express 3.0.0alpha e socket .io non sono (direttamente) compatibili, a causa di modifiche in Express tra 2. * e 3. * (o meglio, modifiche in Connect tra 1. * e 2. *). Ti suggerisco di effettuare il downgrade a Express 2.5.9 per il momento, oppure puoi seguire this advice dall'autore di Express ', TJ Holowaychuk.

+0

cool. Proverò questo, grazie mille. – rlemon

4

Ho installato un ambiente di test, installato Express 3.0 e socket.io 0.9.5 e riprodotto il tuo errore.

Quindi ho eseguito npm install [email protected] fatto un paio di modifiche all'indietro in base allo migration guide e funzionava alla grande.

Quindi ho intenzione di andare avanti e suggerisco che socket.io probabilmente non è ancora compatibile con Express 3, che sembra ancora piuttosto instabile.

miei app.js ottimizzato per espresso 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); 

il mio indice.file 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> 

Spero che qualcosa qui aiuti.

+0

wow, risposta incredibilmente utile. Vorrei poterti sorpassare due volte! Passerò l'installazione e spero che questo risolva anche il problema! – rlemon

+0

Ho apportato le modifiche che hai suggerito e modificato la mia app un po 'per renderla compatibile con la versione precedente ... ora sto ricevendo 'warn - unknown transport:" undefined "\ n info - unhandled socket.io url' – rlemon

+0

s/\ n/interruzione di riga – rlemon

0

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

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

... salvare il file, riavviare il server del nodo.

Problemi correlati