我有这个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 chrome上我得到:
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错误......
对问题可能是什么有任何想法?
答案 0 :(得分:34)
网站的域名与托管的位置无关,它与您用来访问它的URL有关。
即使" 192.168.1.130"和#34; 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();
这样它将默认为您所基于的任何域,并且它将在localhost,IP以及最终使用的域名上工作。
答案 1 :(得分:2)
将app.listen(80)更改为app.listen(80,'192.168.1.130')以使其使用该IP,这样来自socket.io的URL应该是正确的。即使您在本地计算机上尝试,也请务必在浏览器中从192.168.1.130访问它。