我有这个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错误…
对可能是什么问题有任何想法吗?
网站的域名与托管位置无关,而与您用来访问它的URL有关。
即使“ 192.168.1.130”和“ localhost”解析到同一服务器,它们也被视为不同的域。
结果,因为您具有客户端代码:
var socket = io.connect('http://localhost');
您正在连接到 域 localhost。如果客户端代码是由本地主机提供的,则很好,但是如果要从另一个域(例如192.168.1.130)加载客户端,则会遇到问题。从浏览器和服务器的角度来看,您很容易成为尝试访问该服务的完全陌生人。
要解决此问题,请将客户端套接字创建更改为:
var socket = io.connect('192.168.1.130');
您应该已经解决了问题。
实际上,您应该完全删除该参数并尝试运行:
var socket = io.connect();
这样,它将默认为您所基于的任何域,并且将在localhost,IP以及最终使用的域名上都可以使用。