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 に答える