2016-05-19 16 views
-2

Seltsames Problem habe ich nicht wirklich über Dokumentation gefunden. Ich denke, es könnte am Ende ein einfacher Fall von "Sie verstehen nicht, wie das Produkt funktioniert" und ich hoffe, dass jemand die Lücke (n) füllen kann.Socket.io mehrere Verbindungen

Hier ist was los ist ... Ich habe 3 separate Apps, die socket.io-Server sind. Sie hören alle auf verschiedenen Ports. Jeder Server ist für einen anderen speziellen Zweck vorgesehen. Ich baue die Anwendung so, dass ich sie in Teilen erweitern kann und nur die einzelnen isolierten Teile, die ich ändern/aktualisieren muss.

Das funktionierte gut, bis ich erkannte, dass für jede Anwendung, die ausgeführt wird, eine zusätzliche Socketverbindung pro Server ist. Wenn ich also 3 Apps habe, dann habe ich 3 Verbindungen auf jedem Server.

Der Beweis dafür ist, dass wenn ich eine console.log ("Connected") zu jedem Server hinzufügen, dann verbinden Sie einen Client, jeder Server meldet so viele Verbindungen wie es Server gibt. Hoffentlich macht das Sinn.

Mein Ziel, ich will 1 Verbindung pro Server. Es scheint, als ob die Verbindungen jeweils als generische Verbindung zu allen Socket-Servern agieren. Mein Server Zuhörer sind wie folgt aufgebaut:

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

Meine Kunden wie folgt verbinden:

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

EDIT:

hinzuzufügen auf meine ursprüngliche Frage, so dass Sie mehr Code sehen können. ..

Voll Client-Code:

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); 
}); 

Der Code-Server ist ziemlich lang ... Also die entsprechenden Stücke sind:

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

Was ist falsch an mehreren Verbindungen? – SLaks

+0

Wenn es nur mehrere Verbindungen wären, wäre das kein Problem. Das Problem ist, dass bei mehreren Verbindungen alle .emit() - Befehle mehrmals ausgeführt werden. Das bedeutet eine Menge verschwendeter Zeit/Netzwerkressourcen – Ethan

+0

Klingt, als ob Sie entweder an die falschen Dinge oder an den falschen Orten emittieren. – SLaks

Antwort

-3

Versuchen Sie, die ‚neuen‘ Schlüsselwort aus der io Sache zu entfernen. Sie sollten dort nicht 'new' verwenden, da es jedes Mal neue Instanzen erstellen würde, wenn Sie die Seite neu laden oder eine neue Clientverbindung herstellt. So sollte es aussehen: Seite Server:

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

Client-Seite:

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

Ich denke, das ist das, was Sie suchen.

+0

Interessant, ich gebe das eine Chance, wenn ich wieder daran arbeite. Vielen Dank! – Ethan

+0

Das ist völlig falsch. Das ist der Client, der sich verbindet; Es benötigt eine Instanz. Und das wird entweder scheitern oder keinen Unterschied machen. – SLaks

+0

Nach socket.io, nicht falsch, denke ich. Socket.IO überträgt alle seine Daten mit 1 Websocket.Es muss also keine Instanz pro Client erstellt werden. Wie auch immer du weißt besser als ich, da ich noch lerne und dieser Ausschnitt funktioniert perfekt für mich. – KAKAN

Verwandte Themen