22

我有这个 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 错误...

知道问题可能是什么吗?

4

2 回答 2

40

站点的域与其托管位置无关,它与您用来访问它的 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();

这样,它将默认为您所基于的任何域,并且它将在 localhost、IP 以及最终您使用的域名上工作。

于 2012-08-11T22:41:56.903 回答
2

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

于 2012-08-11T19:51:07.673 回答