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 в браузере, даже если вы попробуете его на локальной машине.