2012-02-25 7 views
16

Tengo problemas incluso para obtener la muestra de socket.io muy básica para ejecutar. Por ejemplo, el primer ejemplo de la página de bienvenida de su sitio:obteniendo la muestra básica de socket.io para trabajar

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

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

en el lado del servidor y

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost'); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 

en el lado del cliente. Si salvo el lado del servidor en un archivo host.js, y el lado del cliente en un archivo client.htm, y corro npm host.js, consigo

info - socket.io started 
    warn - error raised: Error: listen EADDRINUSE 

que está ya en realidad no espera. Luego, para el client.htm (o al menos eso es lo que creo que se supone que debo hacer con él, pegándolo en un archivo client.htm), solo obtengo una pantalla en blanco. No es muy sorprendente, ya que comienza incluyendo un archivo no existente /socket.io/socket.io.js, pero incluso cambiando esto a host.js (que supongo que se supone que es) no cambia el hecho de que solo aparece una pantalla en blanco ...

No tengo idea.

Respuesta

16

EADDRINUSE significa que la dirección ya está en uso por lo que no puede obtener el socket. ¿Hay algo más que se esté ejecutando en el puerto 80 en su máquina? 80 es comúnmente utilizado por los servidores web.

También puede probarlo en algún otro puerto.

La razón por la que ve un archivo en blanco es que no se conecta al servidor de nodo (ya que no pudo obtener el socket) por lo que el evento de noticias nunca se llamará. Incluso podría conectar a la toma de cualquier otra cosa que se está ejecutando en 80 que nunca se emitirá ese evento :)

Después de resolver el conflicto de puerto, cuando se ejecuta el servidor, se debe simplemente decir:

info - socket.io comenzó

y está esperando las conexiones.

Asegúrese de actualizar la línea htm a su puerto. Por ejemplo, si 81:

var socket = io.connect('http://localhost:81'); // note the :81 

EDIT: acabo probado a cabo y en el archivo htm tuve que establecer la ruta relativa al archivo socket.io.js. Después de instalarlo a través de npm, estaba aquí en mi directorio.

<script src="node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js"></script> 

Asegúrese de que la ruta sea relativa al archivo htm (no comienza con a /). Aquí es cómo descubrí cuando era mío:

find . -name 'socket.io.js' 

en Win: dir socket.io.js/s

También debe ejecutar el host con (en * nix es posible que necesite sudo delante):

node host.js 

último que hice cuando se trata de la muestra fue el cambio de un par de líneas en el archivo htm a esto para que pudiera ver un cuadro de mensaje de alerta cuando ocurrió el evento:

socket.on('news', function (data) { 
    alert(JSON.stringify(data)); 
+1

¿Importa qué puerto? Intenté 81 y ahora simplemente se cuelga cuando ejecuta el lado del host, es decir, dice 'info - socket.io started', pero no regresa a la línea de comandos. La página .htm aún está en blanco, por lo que parece que no resuelve el problema. – user1111929

+3

Resolvió el error EADDRINUSE que fue su primer problema. Sí, eso importa. Tampoco está colgando: el servidor se está ejecutando en espera de las comunicaciones. Entonces, ahora ha solucionado la mitad del problema del lado del servidor. – bryanmac

+0

para el lado del cliente del problema, ¿actualizó la página htm para conectarse a http: // localhost: 81 (no el: 81)? – bryanmac

Cuestiones relacionadas