web-dev-qa-db-fra.com

Socket.IO ne fonctionne que localement

J'ai ce Node.JS serveur :

var app = require('express')();
var server = app.listen(80);
var io = require('socket.io').listen(server);
var posx = 10;
var posy = 10;

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

io.sockets.on('connection', function (socket) {
    socket.emit('start', {
        x: posx,
        y: posy
    });

    socket.on('newpos', function (data) {
        posx = data["x"];
        posy = data["y"];
        socket.broadcast.emit('move', { x: posx, y: posy });
    });
});

CODE CÔTÉ CLIENT:

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

            socket.on('start', function (data) {
                $("#pointer").animate({
                    'top': data["y"],
                    'left': data["x"]
                }, 0);
            });

            socket.on('move', function (data) {
                $("#pointer").animate({
                    'top': data["y"],
                    'left': data["x"]
                }, "slow");
            });

            $("#pointer").draggable({
                stop: function(event, ui) {
                    var pos = $("#pointer").position();

                    socket.emit('newpos', {
                        'x': pos.left,
                        'y': pos.top
                    });
                }
            });

Le problème est que cela ne semble fonctionner que localement. Sur ubuntu chrome, je reçois:

XMLHttpRequest cannot load http://localhost/socket.io/1/?t=1344711676473. Origin http://192.168.1.130 is not allowed by Access-Control-Allow-Origin.

Alors que sur un mac, je rencontre une erreur GET pour le même fichier ...

Une idée sur ce que le problème pourrait être?

17
user1130217

Le domaine d'un site n'a pas à voir avec l'endroit où il est hébergé, mais avec l'URL que vous utilisez pour y accéder.

Même si "192.168.1.130" et "localhost" sont résolus sur le même serveur, ils sont considérés comme des domaines différents.

En conséquence, parce que vous avez le code côté client:

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

Vous vous connectez au domain localhost. Si le code client a été servi par localhost, vous pouvez vous en servir, mais si vous chargez le client à partir d'un autre domaine (par exemple 192.168.1.130), vous rencontrerez des problèmes. Du point de vue du navigateur et du serveur, vous pourriez facilement être un parfait inconnu essayant d'accéder à ce service.

Pour résoudre le problème, modifiez la création de socket côté client en:

var socket = io.connect('192.168.1.130');

Vous devriez avoir votre problème résolu.

Vraiment cependant, vous devriez juste supprimer complètement le paramètre et essayer de lancer:

var socket = io.connect();

De cette façon, le domaine par défaut sera utilisé par défaut et fonctionnera à la fois sur localhost, l'adresse IP et, éventuellement, sur le nom de domaine que vous utilisez.

34
slifty

Modifiez app.listen (80) en app.listen (80, '192.168.1.130') pour qu'il puisse utiliser cette adresse IP. Ainsi, les URL de socket.io doivent être correctes. Assurez-vous également d'y accéder à partir de 192.168.1.130 dans votre navigateur, même si vous l'essayez sur la machine locale.

2
Clarence