Socket.IO работает только локально

У меня есть этот Node.JS сервер:

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

КЛИЕНТСКИЙ СТОРОН:

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

Проблема в том, что она работает только локально. На ubuntu хром я получаю:

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

Пока на mac, у меня есть ошибка GET для того же файла...

Любая идея о том, что может быть проблемой?

Ответы

Ответ 1

Домен сайта не связан с тем, где он размещен, он связан с тем, какой URL-адрес вы используете для доступа к нему.

Даже если "192.168.1.130" и "localhost" разрешены на один и тот же сервер, они считаются разными доменами.

В результате, поскольку у вас есть код на стороне клиента:

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

Вы подключаетесь к домену localhost. Если клиентский код обслуживался с помощью localhost, вы в порядке, но если вы загружаете клиент из другого домена (например, 192.168.1.130), вы столкнетесь с проблемами. С точки зрения браузера и сервера вы можете легко стать совершенно незнакомым человеком, пытающимся получить доступ к этой службе.

Чтобы устранить проблему, измените создание сокета клиентской стороны на:

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

У вас должна быть проблема.

Действительно, вы должны просто полностью удалить параметр и попробовать запустить:

var socket = io.connect();

Таким образом, он будет использоваться по умолчанию для любого домена, на котором вы основаны, и будет работать как на локальном хосте, так и на IP-адресе и, в конечном счете, на имя домена, которое вы используете.

Ответ 2

Измените app.listen(80) на app.listen(80, '192.168.1.130'), чтобы использовать этот IP-адрес, таким образом ваши URL-адреса из socket.io должны быть правильными. Также не забудьте получить к нему доступ с 192.168.1.130 в браузере, даже если вы попробуете его на локальной машине.