2017-02-17 14 views
0

Yii 1.1でyii-nodeソケットを設定しましたが、すべてがlocalhost上で正常に動作します。全く問題はありません。 Google Compute Engineでプロジェクトをホストしようとしていたため、socket.io.jsで404を送信していたNodeJsサーバを起動するために、内部IPに外部IPをバインドする際に問題が発生しました。私はserver.listenメソッドからホストを削除することで問題を解決し、任意のIPアドレスにバインドできるようにしました。そして、socket.io jsファイルはパブリックIPでクライアントにロードされます。インスタンス用に予約された静的IPを作成し、以下の設定で同じIPを使用しました。yii-nodeソケットがGoogle Compute Engineで動作しません

ウェブサイトがロードされているときに生成されたuinque urlがまだGCPのlocalhostを指しているため、クライアントハンドシェイクが機能しません。私はlocalhostの代わりにserver-ipでなければならないと信じています。

マイノードソケットの構成は以下

'nodeSocket' => array( 
'class' => 'application.extensions.yii-node-socket.lib.php.NodeSocket', 
'host' => 'xxx.211.xxx.99', // default is 127.0.0.1, can be ip or domain name, without http 
'allowedServerAddresses' => [ "127.0.0.1", "xxx.211.xxx.99", "::ffff:xxx.211.xxx.99" ], 
'origin' => '*:*', 
'port' => 3001 // default is 3001, should be integer) 

である私はYiiの

debug - served static content /socket.io.js 
debug - client authorized 
info - handshake authorized nvQHUiA9E1dBBKmHv69k 
debug - setting request GET /socket.io/1/websocket/nvQHUiA9E1dBBKmHv69k 
debug - set heartbeat interval for client nvQHUiA9E1dBBKmHv69k 
debug - client authorized for 
debug - websocket writing 1:: 
debug - client authorized for /server 
debug - websocket writing 1::/server 
info - transport end (undefined) 
debug - set close timeout for client nvQHUiA9E1dBBKmHv69k 
debug - cleared close timeout for client nvQHUiA9E1dBBKmHv69k 
debug - cleared heartbeat interval for client nvQHUiA9E1dBBKmHv69k 
debug - discarding transport 

server.jsコード

var express = require('express'); 
var app = express(); 
var server = require('http').createServer(app) 
var io = require('socket.io').listen(server); 
var cookie = require('cookie'); 
var serverConfiguration = require('./server.config.js'); 
var storeProvider = express.session.MemoryStore; 
var sessionStorage = new storeProvider(); 

var componentManager = require('./components/component.manager.js'); 
componentManager.set('config', serverConfiguration); 

var eventManager = require('./components/event.manager.js'); 
var socketPull = require('./components/socket.pull.js'); 
var db = require('./components/db.js'); 
db.init(serverConfiguration.dbOptions); 

componentManager.set('db', db); 
componentManager.set('sp', socketPull); 
componentManager.set('io', io); 
componentManager.set('eventManager', eventManager); 
componentManager.set('sessionStorage', sessionStorage); 

server.listen(serverConfiguration.port); 
console.log('Listening ' + serverConfiguration.host + ':' + serverConfiguration.port); 

// accept all connections from local server 
if (serverConfiguration.checkClientOrigin) { 
    console.log('Set origin: ' + serverConfiguration.origin); 
    io.set("origins", serverConfiguration.origin); 
} 

// client 
io.of('/client').authorization(function (handshakeData,accept) { 

    if (!handshakeData.headers.cookie) { 
     return accept('NO COOKIE TRANSMITTED', false); 
    } 

    handshakeData.cookie = cookie.parse(handshakeData.headers.cookie); 

    var sid = handshakeData.cookie[serverConfiguration.sessionVarName]; 
    if (!sid) { 
     return accept('Have no session id', false); 
    } 

    handshakeData.sid = sid; 
    handshakeData.uid = null; 

    // create write method 
    handshakeData.writeSession = function (fn) { 
     sessionStorage.set(sid, handshakeData.session, function() { 
      if (fn) { 
       fn(); 
      } 
     }); 
    }; 

    // trying to get session 
    sessionStorage.get(sid, function (err, session) { 

     // create session handler 
     var createSession = function() { 
      var sessionData = { 
       sid : sid, 
       cookie : handshakeData.cookie, 
       user : { 
        role : 'guest', 
        id : null, 
        isAuthenticated : false 
       } 
      }; 

      // store session in session storage 
      sessionStorage.set(sid, sessionData, function() { 

       // authenticate and authorise client 
       handshakeData.session = sessionData; 
       accept(null, true); 
      }); 
     }; 

     // check on errors or empty session 
     if (err || !session) { 
      if (!session) { 

       // create new session 
       createSession(); 
      } else { 

       // not authorise client if errors occurred 
       accept('ERROR: ' + err, false); 
      } 
     } else { 
      if (!session) { 
       createSession(); 
      } else { 

       // authorize client 
       handshakeData.session = session; 
       handshakeData.uid = session.user.id; 
       accept(null, true); 
      } 
     } 
    }); 

}).on('connection', function (socket) { 

    // add socket to pull 
    socketPull.add(socket); 

    // connect socket to him channels 
    componentManager.get('channel').attachToChannels(socket); 

    // bind events to socket 
    eventManager.client.bind(socket); 
}); 

// server 
io.of('/server').authorization(function (data, accept) { 
    if (data && data.address) { 
     if (data.headers['cookie']) { 
      data.cookie = cookie.parse(data.headers.cookie); 
      if (data.cookie.PHPSESSID) { 
       data.sid = data.cookie.PHPSESSID; 
       var found = false; 
       for (var i in serverConfiguration.allowedServers) { 
        if (serverConfiguration.allowedServers[i] == data.address.address) { 
         found = true; 
         break; 
        } 
       } 
       if (found) { 
        var createSession = function() { 
         var sessionData = { 
          sid : data.cookie.PHPSESSID, 
          cookie : data.cookie, 
          user : { 
           role : 'guest', 
           id : null, 
           isAuthenticated : false 
          } 
         }; 

         // store session in session storage 
         sessionStorage.set(data.cookie.PHPSESSID, sessionData, function() { 

          // authenticate and authorise client 
          data.session = sessionData; 
          accept(null, true); 
         }); 
        }; 
        data.writeSession = function (fn) { 
         sessionStorage.set(data.cookie.PHPSESSID, data.session, function() { 
          if (fn) { 
           fn(); 
          } 
         }); 
        }; 
        sessionStorage.get(data.cookie.PHPSESSID, function (err, session) { 
         if (err || !session) { 
          if (!session) { 
           createSession(); 
          } else { 
           accept('ERROR: ' + err, false); 
          } 
         } else { 
          if (!session) { 
           createSession(); 
          } else { 

           // authorize client 
           data.session = session; 
           data.uid = session.user.id; 
           accept(null, true); 
          } 
         } 
        }); 
       } else { 
        accept('INVALID SERVER: server host ' + data.address.address + ' not allowed'); 
       } 
      } else { 
       accept('PHPSESSID is undefined', false); 
      } 

     } else { 
      accept('No cookie', false); 
     } 
    } else { 
     accept('NO ADDRESS TRANSMITTED.', false); 
     return false; 
    } 
}).on('connection', function (socket) { 

    // bind events 
    eventManager.server.bind(socket); 
}); 

componentManager.initCompleted(); 
+0

あなたのコードが参考になると思います。 socket.ioは別のIPで提供されていますか? – pudility

+0

@ZoeCarverサーバーコード – Sumedh

+0

ありがとう、ポストを編集しました。私は朝のコードを見て回ります:) – pudility

答えて

0

からイベントを発生しようとしたとき、私はできたログですそれを解決するために.. :)私は、ローカルホストを指している古いコードを持っていたキャッシュされた資産を見逃すと、私はキャッシュをクリアしたときにyii assetsフォルダから編集しました。 Google Compute Engineの任意のIPアドレスからのリクエストを受け入れることができるように、ホストのバインディングをserver.listenメソッドから削除するための設定が1回だけ必要でした。

関連する問題