web-dev-qa-db-fra.com

socket.io: impossible de charger la ressource

J'essaie de démarrer avec socket.io et node.js.

En suivant le premier exemple sur le site de socket.io, j'obtiens l'erreur suivante dans la console du navigateur:

Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:3001/socket.io/socket.io.js
Uncaught ReferenceError: io is not defined 

Ceci est mon server.js

var app = require('express').createServer()
  , io = require('socket.io').listen(app);

app.listen(3001);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

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

Et voici mon index.html

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <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>
  </body>
</html>

J'ai déjà installé socket.io ..

19
gaggina

Les problèmes

  • Tout d'abord, vous devez regarder le port du serveur sur lequel le serveur est lié (app.listen(3001);) côté client afin d'atteindre le serveur.

  • Comme pour socket.io, l'ajout de http://localhost:3001 Avant le reste de la source dans la balise de lien résout ce problème. Cela est apparemment dû à la façon dont le réseau lie les ports à l'hôte local, mais j'essaierai de trouver plus d'informations sur la cause;

Que changer:


La liaison de port pour le serveur:

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

devrait être changé en

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



Faire en sorte que socket.io se comporte:

<script src="/socket.io/socket.io.js"></script>

devrait être changé en

<script src="http://localhost:3001/socket.io/socket.io.js"></script>


24
Michael Zaporozhets

Si vous utilisez express version 3.x, il y a problèmes de compatibilité Socket.IO qui nécessitent un peu de réglage pour migrer :

La méthode .listen() de Socket.IO prend une instance de http.Server Comme argument.
Depuis 3.x , la valeur de retour de express() n'est pas une instance de http.Server . Pour que Socket.IO fonctionne avec Express 3.x, assurez-vous de créer et de transmettre manuellement votre instance http.Server À la méthode .listen() de Socket.IO.

Voici un petit exemple:

var app = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);

server.listen(3000);
6
Marius Butuc

Premièrement, la documentation Socket.io " Comment utiliser " est vague (peut-être trompeuse); en particulier lors de la documentation du code pour le client Socket.io.

Deuxièmement, les réponses que vous avez données ici sur StackOverflow sont trop spécifiques. Vous ne devriez pas avoir à coder manuellement le protocole, le nom d'hôte et le numéro de port pour le client Socket.io; ce n'est pas une solution évolutive. Javascript peut gérer cela pour vous avec l'objet de localisation - window.location.Origin.

Premiers pas avec Socket.io

Installation

Socket.io nécessite l'installation d'un serveur et d'un client.

Pour installer le serveur
npm install socket.io

Pour utiliser le client, ajoutez ce script à votre document (index.html)
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>

Implémentation avec Express 3/4

Créez les fichiers suivants:

Serveur (app.js)

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

server.listen(80);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

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

Client (index.html)

<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
  // Origin = http(s)://(hostname):(port)
  // The Socket.io client needs an Origin
  // with an http(s) protocol for the initial handshake.
  // Web sockets don't run over the http(s) protocol,
  // so you don't need to provide URL pathnames.
  var Origin = window.location.Origin;
  var socket = io.connect(Origin);
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>
1
tfmontague

Essaye ça

var app = express()
,http = require('http');

var server = http.createServer(app);
server.listen(3001);
io = require('socket.io').listen(server);
io.set('log level', 1); 

J'espère que ça aide

0
Abdul Hamid

Si vous essayez d'exécuter cela sur un autre ordinateur et que vous obtenez cette erreur, vous pouvez trouver cela utile.

var Host = window.location.hostname; 
var socket = io.connect('http://' + Host);

Si vous utilisez https, vous devez évidemment également modifier le protocole. Dans mon cas, je devais créer un serveur qui fonctionnerait sur plusieurs ordinateurs locaux, donc mettre ici une adresse fixe ne fonctionnerait pas, car le socket devrait se connecter à une adresse différente selon le serveur à partir duquel vous chargez la page. Ajouter ceci ici car cela peut aussi aider quelqu'un d'autre.

0
Laky