web-dev-qa-db-fra.com

socket.io - ne peut pas le faire fonctionner, ayant 404 sur une sorte d'appel d'interrogation

J'essaie d'obtenir un serveur configuré avec socket.io, avec de mauvais résultats.

Je suis principalement en train de suivre ce guide, bien qu'il soit quelque peu obsolète: http://www.williammora.com/2013/03/nodejs-tutorial-building-chatroom-with.html

Le problème vient de socket.io, je ne sais pas si c'est côté client ou serveur. Il semble essayer d'interroger le serveur en continu, mais récupère le 404. Cela ressemble à socket.io ne fonctionne pas, mais tout me semble normal. Cela peut aussi avoir quelque chose à voir avec les chemins et avoir un répertoire "public", mais je ne sais pas vraiment.

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"

Serveur

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." );
});

Client

script( src="js/socket.io.js" )
var socket = io.connect( "http://localhost:8080" );

J'ai obtenu le fichier js client de: node_modules/socket.io/node_modules/socket.io-client/socket.io.js

Ce chemin ne correspond ni à ce que dit le didacticiel que j'utilise, ni à ce que socket.io dit d'utiliser, donc c'est peut-être le problème, mais il semble que ce soit probablement le bon fichier.

Une aide ici?

[~ # ~] modifier [~ # ~] Pour plus d'informations, voici la hiérarchie de mes dossiers:

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

Le server.js dans le dossier my_modules est l'endroit où je démarre socket.io côté serveur. Le server.js dans le dossier js est le code client pour se connecter à partir du site Web.

32
Eli

Il semble que Socket.IO ne puisse pas intercepter les demandes commençant par /socket.io/. En effet, dans votre cas, l'écouteur est app - un gestionnaire Express. Vous devez faire de http un écouteur, afin que Socket.IO ait accès à la gestion des requêtes.

Essayez de remplacer

app.set( "ipaddr", "127.0.0.1" );
app.set( "port", 8080 );

avec

http.listen(8080, "127.0.0.1");

Voir les documents pour plus de détails: http://socket.io/docs/#using-with-express-3/4

61
Oleg

Dans mon cas, j'ai créé mon application avec le Générateur d'applications express . Pour résoudre ce problème, au lieu de modifier le fichier app.js sur le dossier racine du projet, j'ai modifié le fichier bin/www sur la ligne une fois le serveur défini:

/**
 * Create HTTP server.
 */

var server = http.createServer(app);
var io = require('socket.io')(server); // Add this here

Mise à jour

J'ai trouvé un meilleur moyen ici Express Generator et Socket.io

5
Camilo

Juste pour vérifier qu'il s'agit de votre serveur ou simplement d'un problème client, vous pouvez utiliser ce site Web: websocket-echo , si ce client se connecte directement à votre serveur (le premier formulaire client est utile si votre serveur est en ligne, si est sur votre hôte, cuoting de websocket.org ...

À l'aide d'un éditeur de texte, copiez le code suivant et enregistrez-le en tant que websocket.html quelque part sur votre disque dur

Code: websocket-test

La seule chose différente de la mienne que j'ai pu observer est la source du client io: <script src="/socket.io/socket.io.js"></script> côté client.

Sur votre serveur, vous devriez essayer de cette façon:

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);

Notez que cette méthode fonctionne correctement avec ces dépendances: je vous recommande d'ajouter ce code ci-dessous à votre fichier package.json:

"dependencies": {
    "express": "3.x.x",
    "socket.io": "*",
    "util": "*"
  }

à votre santé!

2
lgargantini