node.js - tutorial - socket.io: no puede hacer que funcione, teniendo 404''s en algún tipo de llamada de sondeo
socket.io tutorial español (3)
Estoy intentando configurar un servidor con socket.io, con malos resultados.
Principalmente estoy siguiendo esta guía, aunque está algo desactualizada: http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html
El problema viene con socket.io, no estoy seguro si es cliente o servidor. Parece estar intentando continuamente sondear el servidor, pero está recuperando 404. Eso suena como socket.io no se está ejecutando, pero todo se ve bien para mí. También puede tener algo que ver con los caminos y tener un directorio "público", pero realmente no lo sé.
127.0.0.1 - - [Thu, 17 Jul 2014 00:51:36 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558296120-0 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4"
127.0.0.1 - - [Thu, 17 Jul 2014 00:51:37 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558297181-1 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4"
127.0.0.1 - - [Thu, 17 Jul 2014 00:51:39 GMT] "GET /socket.io/?EIO=2&transport=polling&t=1405558299207-2 HTTP/1.1" 404 73 "http://localhost:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.76.4 (KHTML, like Gecko) Version/7.0.4 Safari/537.76.4"
Servidor
var exec = require( "child_process" ).exec;
var path = require( "path" );
var morgan = require( "morgan" );
var bodyParser = require( "body-parser" );
var _ = require( "underscore" );
var express = require( "express" );
var app = express();
var http = require( "http" ).createServer( app );
var io = require( "socket.io" )( http );
app.set( "ipaddr", "127.0.0.1" );
app.set( "port", 8080 );
//support JSON, urlencoded, and multipart requests
app.use( bodyParser() );
//log the requests using morgan
app.use( morgan() );
//specify the Jade views folder
app.set( "views", __dirname + "/../views" );
//set the view engine to Jade
app.set( "view engine", "jade" );
//specify static content
app.use( express[ "static" ]( "public", __dirname + "/../public" ) ); //using map-access of static so jslint won''t bitch
io.on( "connection", function( socket )
{
console.log( "A user connected." );
});
Cliente
script( src="js/socket.io.js" )
var socket = io.connect( "http://localhost:8080" );
Obtuve el archivo js del cliente de: node_modules / socket.io / node_modules / socket.io-client / socket.io.js
Esa ruta no concuerda con lo que dice el tutorial que uso, o con lo que dice socket.io, entonces tal vez ese es el problema, pero parece que probablemente sea el archivo correcto.
¿Alguna ayuda aquí?
EDITAR Para obtener información adicional, aquí está la jerarquía de mi carpeta:
Webserver/
my_modules/
server.js
node_modules/
body-parser/
express/
jade/
morgan/
socket.io/
underscore/
public/
css/
js/
server.js
views/
index.jade
index.js
package.json
El servidor.js en la carpeta my_modules es donde inicio socket.io en el lado del servidor. El servidor.js en la carpeta js es el código del cliente para conectarse desde el sitio web.
En mi caso, creé mi aplicación con el generador de aplicaciones Express . Para resolver este problema, en lugar de editar el archivo app.js en la carpeta raíz del proyecto, edité el archivo bin / www en la línea después de que se definió el servidor:
/**
* Create HTTP server.
*/
var server = http.createServer(app);
var io = require(''socket.io'')(server); // Add this here
Actualizar
Encontré una mejor manera aquí Express Generator y Socket.io
Parece que Socket.IO no puede interceptar solicitudes que comienzan con /socket.io/
. Esto se debe a que en su caso el oyente es una app
: un controlador Express. Tienes que hacer que http
sea el oyente, para que Socket.IO tenga acceso al manejo de las solicitudes.
Intenta reemplazar
app.set( "ipaddr", "127.0.0.1" );
app.set( "port", 8080 );
con
http.listen(8080, "127.0.0.1");
Ver documentos para más detalles: http://socket.io/docs/#using-with-express-3/4
Solo para comprobar que es su servidor o simplemente un problema del cliente, puede usar este sitio web: websocket-echo , si este cliente se conecta directamente a su servidor (el primer cliente de formulario es útil si su servidor está en línea, si está en su host, websocket.org ...
Usando un editor de texto, copie el siguiente código y guárdelo como websocket.html en algún lugar de su disco duro
Código: websocket-test
La única cosa diferente a la mía que pude observar es la fuente del cliente io: <script src="/socket.io/socket.io.js"></script>
en el lado del cliente.
En tu servidor deberías probarlo de esta manera:
var express = require(''express''),
app = express(),
http = require(''http''),
server = http.createServer(app),
io = require(''socket.io'').listen(server),
exec = require(''child_process'').exec,
util = require(''util'');
//serve our code
app.use(express.static(''public''));
app.use(express.json());
app.use(express.urlencoded());
//listening on connections
io.on(''connection'', function (socket) {
console.log(''client connected!'');
}
server.listen(8080);
Tenga en cuenta que de esta manera funciona bien con estas dependencias: le recomiendo que agregue este código a continuación a su archivo package.json:
"dependencies": {
"express": "3.x.x",
"socket.io": "*",
"util": "*"
}
¡aclamaciones!