2012-04-05 16 views
23

Estoy tratando de comenzar con node.js y socket.io.
Tengo una muy simple (muy) simple aplicación de prueba de cliente-servidor y no puedo hacer que funcione.
El sistema está configurado en una máquina de Windows con un servidor apache.
El Apache se está ejecutando en el port 81 y la socket.io está configurado para escuchar port 8001socket.io - el evento 'connect' no se activa en el cliente

servidor - 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'); 
}); 

cliente - 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> 

Después de iniciar mi servidor usando node server.js, la salida estándar (esperada) es wr Itten a la consola del servidor:

info: socket.io started 

Al abrir index.html en el navegador (Chrome en mi caso - no probar en otros navegadores) el siguiente registro se escribe en la consola del servidor:

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 
... 
... 
... 

En la consola de navegadores me sale:

connect_failed 

así que parece que el cliente está alcanzando el servidor y tratar de conectar, y el servidor está autorizando el apretón de manos, pero elEl eventonunca se activa en el cliente, en su lugar, el método connect alcanza su connect timeout y max reconnection attempts y deja de devolver connect_failed.

Cualquier ayuda \ opinión sobre esto sería útil.

Gracias

+7

intente Es usando io.connect() se puede inferir la URL y puerto desde la url en la que estás. Me he encontrado con problemas en el pasado con cosas en io.connect que no funcionaban como esperaba. –

+1

@kfiroo ¿obtuviste alguna solución para esto? – Hackableweb

+0

@TimothyStrimple Gracias Tim! ** ¡Trabajando de nuevo en heroku (Cedar) y localhost **! – AmpT

Respuesta

0

intente lo siguiente:

Cambio

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

a

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

Cambio en el frontend (cliente):

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

a

var socket = io.connect();

Después de muchas horas de hacer frente a diversos clientes (Chrome, navegadores Firefox y Phonegap app) que no se hayan registrado conexión con el servidor correctamente (es decir, el servidor registró la conexión de websocket con éxito en sus registros, pero la interfaz no registró el evento de conexión), probé la solución de @ Timothy a partir de los comentarios y ahora todo funciona nuevamente en heroku y en 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');` 
}); 

lado del cliente: El código del lado del cliente solicita la versión de cliente de puerto IO desde el mismo archivo que le da socketIO lado del servidor. Var socket ahora tendrá todos los métodos que están disponibles con socketIO, como socket.emit o socket.on

Lado del servidor: igual que en el lado del cliente, haciendo que los métodos de socketIO estén disponibles para su uso bajo vario.

+0

Bienvenido a StackOverflow. ¿Podría explicar este código un poco? Puede ayudar a los visitantes futuros. –

+0

Esta es la forma más simple de conectarse usando node.js. –

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

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

Trate de usar esto:

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> 
Cuestiones relacionadas