2016-05-19 203 views
-2

奇怪的問題我還沒有真正發現文檔。我認爲它可能最終只是一個「你不明白產品如何工作」的簡單例子,我希望有人能填補這個空白。Socket.io多個連接

以下是發生了什麼...我有3個獨立的應用程序是socket.io服務器。他們都在不同的端口上聆聽。每臺服務器都用於不同的專用目的。我正在構建應用程序,以便我可以部分擴展它,並隻影響我需要更改/更新的單個獨立部分。

這是工作正常,直到我意識到,每個運行的應用程序有一個額外的套接字連接每臺服務器。所以如果我有3個應用程序,那麼我在每臺服務器上都有3個連接。

證據是,如果我向每臺服務器添加一個console.log(「連接」),然後連接一個客戶端,每個服務器會報告與服務器一樣多的連接。希望這是有道理的。

我的目標是每臺服務器需要1個連接。好像這些連接都是作爲所有套接字服務器的通用連接。我的服務器監聽器設置是這樣的:

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

我的客戶端連接是這樣的:

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

編輯:

要添加到我原來的問題,這樣就可以看到更多的代碼。 ..

完整的客戶端代碼:

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東西去掉「新」的關鍵字。 您不應該在那裏使用'新',因爲它會在每次重新加載頁面或新客戶端連接時創建新實例。 所以,它應該看起來像: 服務器端:

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

客戶端:

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

我想這就是你要找的人。

+0

有趣的是,當我重新開始工作時,我會給你一個鏡頭。謝謝! – Ethan

+0

這完全錯了。這是客戶連接;它需要一個實例。那將會失敗或者沒有任何改變。 – SLaks

+0

根據socket.io,我認爲沒有錯。 Socket.IO使用1個websocket傳輸其所有數據。所以,不需要爲每個客戶端創建一個實例。反正你知道比我更好,因爲我還在學習,這段代碼對我來說完全適用。 – KAKAN