2016-05-19 7 views
-2

奇妙な問題私は実際にドキュメントを発見していません。私はそれが "あなたが製品の仕組みを理解していない"という単純なケースに終わるかもしれないと思います。誰かがギャップを埋めることを望んでいます。Socket.io複数の接続

ここには何が起こっているのですか...私はsocket.ioサーバーである3つの別個のアプリケーションを持っています。彼らはすべて異なるポートでリッスンしています。各サーバーは、異なる特殊目的を目的としています。私はアプリケーションを構築してそれを部分的に拡張し、変更/更新する必要のある個々の独立した部分にのみ影響を与えます。

これは正常に動作していました。実行しているアプリケーションごとに、サーバーあたりのソケット接続がであることが分かりました。だから私は3つのアプリを持っている場合、私は各サーバー上の3つの接続があります。

これは、各サーバーにconsole.log( "Connected")を追加してクライアントを接続すると、各サーバーはサーバーと同じ数の接続を報告するという証拠です。うまくいけば、これは理にかなっている。

私の目標は、サーバーあたり1つの接続が必要なのですか?接続がすべてすべてのソケットサーバーへの汎用接続として機能しているようです。私のサーバーのリスナーは、このように設定されています

io = require('socket.io').listen(26265) // can use up to 26485 

私のクライアントは、次のように接続します。

socket = new io('http://localhost:26265') 

EDIT:あなたはより多くのコードを見ることができるように

が私の元の質問へ追加します。 ..

完全なクライアントコード:

importJS('/js/pages/admin_base.js',function(){  
     AdminIO = new io('http://localhost:26266'); 
     AdminIO.on('send_users',function(rows){ 
      toggleLoad(); 
      /* 
      if(typeof rows === 'object'){ 
       rows = Array(rows); 
      } 
      */ 
      appendUsers(rows);  
      console.log(rows); 
     }); 
     AdminIO.on('failed_users',function(){ 
      toggleLoad(); 
      dropInfo("Failed to retrieve userlist",{level: "error"}); 
     }); 
     AdminIO.on('test',function (q) { 
      console.log(q); 
     }); 
    queryUsers(AdminIO); 
}); 

サーバーコードが...かなり長いですので、関連部分は以下のとおりです。

var io = require('socket.io').listen(26266); // can use up to 26484 
//.... imported additional modules and defined simple functions here 
io.on('connection', function (socket) { 
    socket.on('restart_request', function(req){ 
     var success = false 
      , session = JSON.parse(req.session) 
      , sessionID = session.sessionID; 
     checkSession(sessionID, function (ses) { 
      if (ses === false) { console.error('CheckSession failed: No session exists'); return; } 
      if (ses.user.uuid !== session.uuid) { console.error('CheckSession failed: UUID mismatched'); return; } 
      if (ses.user.role < conf['Permissions']['lm_restart']){ socket.emit('restart_fail','Insufficient permissions.'); return; } 
      if(process.platform === 'win32'){    
       executeCMD('START "" .\\windows\\scripts\\restart_lm.bat',function(err,res){ 
        var errSent = false; 
        if(err){       
         console.error(err); 
         if(!errSent){ socket.emit('restart_fail','Restart failed'); } 
         errSent = true; 
         if(res === null){return;} 
        } 
        console.log(res); 
        socket.emit('restart_success','LM successfully restarted.'); 
       });     
      } 
      else if(process.platform === 'linux'){ 

      } 
     }); 
    }); 
    socket.on('get_users',function(req){ 
      var success = false 
      , session = JSON.parse(req.session) 
      , opts = req.opts || null 
      , sessionID = session.sessionID 
      , col = opts.col || null 
      , where = opts.where || null 
      , range = opts.range || null 
      ; 
     checkSession(sessionID, function (ses) { 
      if (!ses) { console.error('CheckSession failed: No session exists'); return; } 
      if (ses.user.uuid !== session.uuid) { console.error('CheckSession failed: UUID mismatched'); return; } 
      if (ses.user.role < conf['Permissions']['lm_user_query']){ socket.emit('userQuery_fail','Insufficient permissions.'); return; }    
      Query.users({col: col, where: where, range: range},function(err,res){ 
       if(!err){socket.emit('send_users',res);} 
       else {socket.emit('failed_users',true);} 
      });    
     }); 
    }); 
    socket.on('test',function(q){ 
     socket.emit('test',q); 
    }); 
}); 
+0

複数の接続で何が問題になっていますか? – SLaks

+0

複数の接続であれば問題ありません。問題は、複数の接続ですべての.emit()コマンドが複数回実行されることです。これは無駄な時間/ネットワークリソースを多く意味します – Ethan

+0

あなたは間違った場所や間違った場所に出ているようです。 – SLaks

答えて

-3

は、IO事から「新しい」キーワードを削除してください。 ページをリロードするか、新しいクライアントが接続するたびに新しいインスタンスが作成されるため、「new」は使用しないでください。 サーバー側: だから、それは次のようになります

var io = require('socket.io')(26265); 

クライアント側:

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

私は、これはあなたが探していたものだと思います。

+0

興味深いことに、私はそれに取り組むために戻ったときに私はそのショットを与えるでしょう。ありがとう! – Ethan

+0

それは完全に間違っています。それはクライアントとの接続です。インスタンスが必要です。そして、それは失敗するか、何の違いも生じません。 – SLaks

+0

socket.ioによると、間違っていないと思います。 Socket.IOは1つのwebsocketを使用してすべてのデータを転送します。したがって、クライアントごとにインスタンスを作成する必要はありません。とにかく私はまだ私が学んでいるように私よりよく知っていますし、スニペットは私のために完全に動作します。 – KAKAN

関連する問題