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错误…

任何想法可能是什么问题?

一个网站的域名不必与托pipe的位置有关,而是与您用来访问的url有关。

即使“192.168.1.130”和“localhost”parsing为同一台服务器,也会被视为不同的域。

因此,由于您有客户端代码:

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

您正在连接到 localhost。 如果客户端代码由本​​地主机提供,那么你很好,但是如果你从另一个域(例如192.168.1.130)加载客户端,那么你将面临问题。 从浏览器和服务器的angular度来看,你可能很容易成为一个完整的陌生人试图访问该服务。

要解决该问题,请将客户端套接字创build更改为:

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

你应该解决你的问题。

实际上,你应该完全删除参数,并尝试运行:

var socket = io.connect();

这样,它将默认为你所基于的任何域,并且它将在本地主机,IP以及最终使用的域名上起作用。

将app.listen(80)更改为app.listen(80,'192.168.1.130')以使用该IP,这样您的来自socket.io的URL应该是正确的。 即使您在本地机器上尝试,也一定要在浏览器中从192.168.1.130访问它。