2011-12-24 27 views
6

Según lo he entendido, desde http://socket.io/#how-to-use, node.js sirve automáticamente el archivo socket.io en el servidor.Socket.io no está servido por el servidor Node.js

He instalado socket.io con npm install socket.io y puedo ver que reside en node_modules un nivel por encima de la raíz del servidor.

server.js:

var static = require('./plugins/node-static'); 
var socketIO = require('socket.io'); 
var clientFiles = new static.Server('./client'); 

var http = require('http'); 
httpServer = http.createServer(function (request, response) { 
    request.addListener('end', function() { 
      clientFiles.serve(request, response); 
     }); 
}).listen(8253); 

var webSocket = socketIO.listen(httpServer); 
webSocket.on('connection', function(client) { ..... 

index.html:

<html> 
<head> 
    <title>Chat</title> 
</head> 
<body> 
    <script src="/socket.io/socket.io.js"></script> 
    <script type="text/javascript" 
      src="http://code.jquery.com/jquery-1.5.2.js"></script> 

    <script type="text/javascript"> 
     $(document).ready(function() { 
      var webSocket = new io.Socket('localhost', { port: 8253 }); 
      webSocket.connect(); ....... 

Inicio del servidor trabaja muy bien, pero al abrir index.html, recibo el siguiente error:

GET http://localhost:8253/socket.io/socket.io.js 404 (Not Found) 
Uncaught ReferenceError: io is not defined     :8253/:25 

Ideas?

+0

"Veo que reside en node_modules un nivel por encima de la raíz del servidor". ¿Qué quiere decir con "raíz del servidor"? No se confunde con ningún rastro de apache, tal vez? Los módulos instalados por NPM residen en los repositorios de NPM, no tienen que estar en ninguna parte en relación con el script del nodo principal de su proyecto. Un 'require ('socket.io')' satisfactorio indica que la instalación está bien y que el problema está en el código. – Kos

Respuesta

6

Trate de escuchar en el servidor después de enlazarlo con socket.io

Coloque este

httpServer.listen(8253); 

después

var webSocket = socketIO.listen(httpServer); 
3

Editado: disculpas, he escrito algo que no respondió a su pregunta.

En el cliente necesita lo siguiente:

var socket = io.connect(); //Hostname and port not required - Autodetected 
socket.on('connect', function(){ 
    $('#status').text('Connected'); 
}); 
socket.on('message', function(m){ 
$('#message').text(m); 
}); 
socket.on('disconnect', function(){ 
$('#status').text('Disconnected'); 
}); 

Ejemplo de trabajo =>https://github.com/parj/node-websocket-demo/blob/master/public/main.js

información NPM (si es necesario): Si está en Linux

cd <location of your server.js> 
npm install -g socket.ion #install globally 
npm link socket.io. #Create a symbolic link 

Si están en Windows no puede hacer el enlace npm

cd <location of your server.js> 
npm install socket.io 

La estructura de directorios debe ser similar

server.js 
node_modules/ #Directory - same level as server.js 
    socket.io #socket.io underneath that 

node_modules deben estar en el mismo directorio que server.js, no por encima de raíz del servidor

+0

No puedo recordar que alguna vez necesite realizar tales magias, el tutorial de introducción tampoco sugiere eso. 'npm install socket.io' debería ser el truco – Kos

+0

BTW" si está en Windows "¿admite npm windows ahora? – Kos

+0

1/npm en Windows => cf artículo stackoverflow - http://stackoverflow.com/questions/7300132/how-to-use-npm-with-node-exe 2/Magic? :) Los tutoriales hablan sobre la instalación de npm. Lo que se pierden es, ¿y si tienes varios proyectos con la misma biblioteca? ¿Entonces para cada proyecto vas y ejecutas la instalación de npm? La mejor solución (imo) es instalarlo globalmente 'npm install -g' y luego crear un enlace a él' npm link'. De esta forma, solo tiene que instalar en un lugar y actualizar solo un lugar. –

-1

Para aquellos que se implementan en Azure (no puedo responder por ninguna otra plataforma), asegúrese de que su archivo package.json incluya un script de inicio.

Ejemplo:

"scripts" : { "start": "node index.js" } 
+0

Esta sugerencia es válida, pero no realmente para este problema. Azure tiene requisitos específicos para las aplicaciones de nodo, pero eso no tiene nada que ver con socket.io. – kubal5003

1

Cuando se está convirtiendo de una aplicación expresa regulares:

const express = require('express') 
const app = express() 
app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}) 

Es importante hacer dos cosas:

Uno (que uno creo que todo el mundo tiene derecha):

var server = require('http').Server(app); 
var io = require('socket.io')(server); 

Dos (éste es muy fácil pasar por alto): llamada server.listen en lugar de app.listen

pasé casi dos horas de depuración esto, es por eso que estoy documentando.

Cuestiones relacionadas