1

socket.io で動作するゲームを手に入れました。ローカルでプレイするときと、自分のコンピューターを介して接続するときに自分の IP アドレス (LAN ではなく実際の IP) を介してプレイすると、正常に動作します。

ただし、自分の IP とポートを他の人に渡すと、インデックス HTML ページはすべて正常に読み込まれますが、socket.io の「接続」は機能しません。

socket.io.js の 1659 行目にエラーが表示されます。

Socket.prototype.handshake = function (fn) {
var self = this
  , options = this.options;

function complete (data) {
  if (data instanceof Error) {
    self.connecting = false;
    self.onError(data.message);
  } else {
    fn.apply(null, data.split(':'));
  }
};

var url = [
      'http' + (options.secure ? 's' : '') + ':/'
    , options.host + ':' + options.port
    , options.resource
    , io.protocol
    , io.util.query(this.options.query, 't=' + +new Date)
  ].join('/');

if (this.isXDomain() && !io.util.ua.hasCORS) {
  var insertAt = document.getElementsByTagName('script')[0]
    , script = document.createElement('script');

  script.src = url + '&jsonp=' + io.j.length;
  insertAt.parentNode.insertBefore(script, insertAt);

  io.j.push(function (data) {
    complete(data);
    script.parentNode.removeChild(script);
  });
} else {
  var xhr = io.util.request();

  xhr.open('GET', url, true);
  if (this.isXDomain()) {
    xhr.withCredentials = true;
  }
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
      xhr.onreadystatechange = empty;

      if (xhr.status == 200) {
        complete(xhr.responseText);
      } else if (xhr.status == 403) {
        self.onError(xhr.responseText);
      } else {
        self.connecting = false;            
        !self.reconnecting && self.onError(xhr.responseText);
      }
    }
  };
  xhr.send(null); //This is the line 1659.
}
};

注: すべてのファイルは、ユーザーの下ではなく、C: ドライブのフォルダー内にあります。

問題はセキュリティ アクセスに関連していますか? または、他の何か?

サーバー + クライアントのコード

//Server
express = require('express');  
http = require('http'); 
app = express(); 
server = http.createServer(app); 
io = require('socket.io').listen(server);

app.use(express.static(__dirname + '/public')); 
server.listen(3000);
app.get('/', function (req, res) { res.sendfile(__dirname + '/index.html'); });

//Client
<script src="/socket.io/socket.io.js"></script> 
<script>var socket = io.connect('http://192.168.1.161:3000');</script>

ルーター構成 http://puu.sh/3ACGz.png

4

1 に答える 1

1

ポート (socket.io 用) がルーターによって転送されていることを確認してください。また、パブリック IP (静的) を使用しています。

同様に、ほとんどのブラウザーでは、WebSocket 経由でページから別のアドレス/ポートに接続することは許可されていないことを覚えておく必要があります。セキュリティ上の理由から、IP/ドメインとポートは、html と js のサーバーの IP/ドメインとポートと同じである必要があります。

于 2013-07-11T09:59:55.303 に答える