2012-04-05 9 views
23

Sto cercando di iniziare con node.js e socket.io.
Ho un (molto) semplice applicazione di test client-server e non riesco a farlo funzionare.
Il sistema è configurato su una macchina Windows con un server Apache.
L'apache è in esecuzione sul port 81 e la socket.io è impostato per ascoltare port 8001socket.io - l'evento 'connect' non viene attivato sul client

Server - server.js

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

io.sockets.on('connection', function (socket) { 
    console.log('\ngot a new connection from: ' + socket.id + '\n'); 
}); 

client - index.html

<!DOCTYPE html> 
<html> 
<head> 
    <title>node-tests</title> 
    <script type="text/javascript" src="http://localhost:8001/socket.io/socket.io.js"> </script> 
    <script type="text/javascript"> 
     var socket = io.connect('http://localhost', { port: 8001 }); 

     socket.on('connect', function() { 
      alert('connect'); 
     }); 

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

     socket.on('connect_failed', function (data) { 
      console.log(data || 'connect_failed'); 
     }); 
    </script> 
</head> 
<body> 

</body> 
</html> 

Dopo l'avvio del server utilizzando node server.js l'output standard (previsto) è wr Itten alla console del server:

info: socket.io started 

Quando apro index.html nel browser (Chrome nel mio caso - non prova su altri browser) il seguente registro viene scritto nella console del server:

info: socket.io started 
debug: served static content /socket.io.js 
debug: client authorized 
info: handshake authorized 9952353481638352052 
debug: setting request GET /socket.io/1/websocket/9952353481638352052 
debug: set heartbeat interval for client 9952353481638352052 
debug: client authorized for 

got a new connection from: 9952353481638352052 

debug: setting request GET /socket.io/1/xhr-polling/9952353481638352052?t=1333635235315 
debug: setting poll timeout 
debug: discarding transport 
debug: cleared heartbeat interval for client 9952353481638352052 
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635238316&i=0 
debug: setting poll timeout 
debug: discarding transport 
debug: clearing poll timeout 
debug: clearing poll timeout 
debug: jsonppolling writing io.j[0]("8::"); 
debug: set close timeout for client 9952353481638352052 
debug: jsonppolling closed due to exceeded duration 
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635258339&i=0 
... 
... 
... 

Nella console browser ottengo:

connect_failed 

Così sembra che il cliente sta raggiungendo il server e il tentativo di connessione, e il server è che autorizza la stretta di mano, ma il 0.123.294 L'eventonon viene mai attivato nel client, invece il metodo di connessione raggiunge il numero connect timeout e max reconnection attempts e restituisce connect_failed.

Qualsiasi aiuto \ intuizione su questo sarebbe utile.

Grazie

+7

provare solo utilizzando io.connect() si può dedurre la URL e porta dall'URL in cui ti trovi. Ho avuto problemi in passato con cose in io.connect che non funzionano come mi aspetterei che succedano. –

+1

@kfiroo hai trovato qualche soluzione per questo? – Hackableweb

+0

@TimothyStrimple Grazie Tim! ** Lavorando di nuovo su heroku (Cedar) e localhost **! – AmpT

risposta

0

provare quanto segue:

Change

var socket = io.connect('http://localhost', { port: 8001 }); 

a

var socket = io.connect('http://localhost:8001'); 
2

Variazione frontend (client):

var socket = io.connect(http://myapp.herokuapp.com);

a

var socket = io.connect();

Dopo molte ore di trattare con i vari clienti (Chrome, browser Firefox e PhoneGap app) che non si sono iscritte connessione al server correttamente (vale a dire il server ha registrato correttamente la connessione websocket nei suoi registri, ma il frontend non ha registrato l'evento di connessione), ho provato la soluzione di @ Timothy dai commenti e ora tutto funziona di nuovo su heroku e su localhost.

4
//Client side 
<script src="http://yourdomain.com:8001/socket.io/socket.io.js"></script> 
var socket = io.connect('http://yourdomain.com:8001'); 

//Server side 
var io = require('socket.io').listen(8001); 
io.sockets.on('connection',function(socket) { 
`console.log('a user connected');` 
}); 

lato client: Il codice lato client richiede la versione client di presa IO dallo stesso file che si dà lato server socketIO. Il socket Var avrà ora tutti i metodi disponibili con socketIO, come socket.emit o socket.on

Lato server: stesso lato client, rendendo i metodi socketIO disponibili per l'uso in var io.

+0

Benvenuti in StackOverflow. Potresti spiegare questo codice un po '? Può aiutare i futuri visitatori. –

+0

Questo è il modo più semplice per connettersi utilizzando node.js. –

0
// server 
var server = http.createServer(app).listen(8001); 

// client 
var socket = io.connect(); 
0

Prova ad usare questo:

Server.js

var http = require("http").createServer(), io = require("socket.io").listen(http); 

http.listen(8001); 

io.sockets.on("connection", function(socket){ 
    console.log("Connected!"); 
    socket.emit("foo", "Now, we are connected"); 
}); 

index.html

<script src="http://localhost:8001/socket.io/socket.io.js"></script> 
<script> 
    var i = io.connect("http://localhost:5001"); 
    i.on("foo", function(bar){ 
     console.log(bar); 
    }) 
</script> 
Problemi correlati