web-dev-qa-db-fra.com

Connecter le client au serveur en utilisant Socket.io

Je suis relativement nouveau sur node.js et ses addons, donc c'est probablement une question de débutant.

J'essaie d'obtenir une simple page HTML sur un serveur Web. Connectez-vous à un autre serveur exécutant node.js avec websocket.io.

Mon code ressemble à ceci:

Client

<script src="socket.io/socket.io.js"></script>
<script>
    // Create SocketIO instance, connect

    var socket = new io.Socket();

    socket.connect('http://127.0.0.1:8080'); 

    // Add a connect listener
    socket.on('connect',function() {
      console.log('Client has connected to the server!');
    });
    // Add a connect listener
    socket.on('message',function(data) {
      console.log('Received a message from the server!',data);
    });
    // Add a disconnect listener
    socket.on('disconnect',function() {
      console.log('The client has disconnected!');
    });

    // Sends a message to the server via sockets
    function sendMessageToServer(message) {
      socket.send(message);
    };
</script>

côté serveur

// Require HTTP module (to start server) and Socket.IO
var http = require('http');
var io = require('socket.io');
var port = 8080;

// Start the server at port 8080
var server = http.createServer(function(req, res){ 
    // Send HTML headers and message
    res.writeHead(200,{ 'Content-Type': 'text/html' }); 
    res.end('<h1>Hello Socket Lover!</h1>');
});

server.listen(port);

// Create a Socket.IO instance, passing it our server
var socket = io.listen(server);

// Add a connect listener
socket.on('connection', function(client){ 
    console.log('Connection to client established');

    // Success!  Now listen to messages to be received
    client.on('message',function(event){ 
        console.log('Received message from client!',event);
    });

    client.on('disconnect',function(){
        clearInterval(interval);
        console.log('Server has disconnected');
    });
});

console.log('Server running at http://127.0.0.1:' + port + '/');

Le démarrage du serveur fonctionne correctement et fonctionne http: // localhost: 808 dans mon navigateur fonctionne également, renvoyant 'Hello Socket Lover' comme prévu. Mais je veux faire parler une page différente aux sockets, pas en lancer une à partir de node.js.

Mais lorsque je l'exécute, rien ne se produit et la console Chrome retourne:

Failed to load resource            http://undefined/socket.io/1/?t=1333119551736
Failed to load resource            http://undefined/socket.io/1/?t=1333119551735

J'y ai passé toute la journée. De l'aide?

46
shmow

Avez-vous essayé de charger le script socket.io à partir d'une URL relative?

Vous utilisez:

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

Et:

socket.connect('http://127.0.0.1:8080');

Tu devrais essayer:

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

Et:

socket.connect('http://localhost:8080');

Commutateur localhost:8080 avec tout ce qui convient à votre configuration actuelle.

De plus, en fonction de votre configuration, vous pouvez rencontrer des problèmes de communication avec le serveur lors du chargement de la page client à partir d'un domaine différent (stratégie de même origine). Cela peut être surmonté de différentes manières (en dehors du champ de cette réponse, google/SO it).

40
Lior Cohen

Vous devez vous assurer que vous ajoutez une barre oblique avant votre lien vers socket.io:

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

Ensuite, dans la vue/le contrôleur, faites simplement:

var socket = io.connect()

Cela devrait résoudre votre problème.

14
instinctious