2017-12-30 33 views
2

Ich arbeite gerade an einem einfachen Chat mit socket.io. Die Grundlagen funktionieren bereits, aber jetzt versuche ich 2 verschiedene Namespaces zu implementieren. Ich möchte, dass der Client von einem Namespace (support-chat) zum anderen (friends-chat) per Knopfdruck wechseln kann.socket.io Namespaces umschalten

Server

//default namespace 
io.on('connection', function(socket){ 
    console.log('a user connected to the chat'); 

    socket.on('disconnect', function(){ 
     console.log('user disconnected'); 
    }); 

    socket.on('client message', function(msg){ 
     io.emit('server_message', msg); 
    }); 
}); 

//namespace /support 
var sup = io.of('/support'); 
sup.on('connection', function(socket){ 
    console.log('someone entered the support-chat'); 

    socket.on('disconnect', function(){ 
     console.log('user disconnected from support-chat'); 
    }); 

    //recieving and emitting message to all clients in namespace /support 
    socket.on('client message', function(msg){ 
     console.log('message received: ' + msg); 
     io.of('/support').emit('server_message', msg); 
    }); 
}); 

//namespace /friends 
var frnd = io.of('/friends'); 
frnd.on('connection', function(socket){ 
    console.log('someone entered the friends-chat'); 

    socket.on('disconnect', function(){ 
     console.log('user disconnected from friends-chat'); 
    }); 

    //recieving and emitting message to all clients in namespace /friends 
    socket.on('client message', function(msg){ 
     console.log('message received: ' + msg); 
     io.of('/friends').emit('server_message', msg); 
    }); 
}); 

Clientside

var socket = io.connect(); 
//toggle namespace 
      $("#support_button").click(function(){ 
       socket.disconnect(); 
       socket = io('/support'); 
       $('#messages').append($('<li>').text("You entered the Support-Chat")); 
      }); 
//toggle namespace 
      $("#friends_button").click(function(){ 
       socket.disconnect(); 
       socket = io('/friends'); 
       $('#messages').append($('<li>').text("You entered the Friends-Chat")); 
      }); 
//sending message on submit 
      $('form').submit(function(){ 
       socket.emit('client message', $('#m').val()); 
       $('#m').val(''); 
       return false; 
      }); 
//recieving message and display 
      socket.on('server_message', function(msg){ 
       $('#messages').append($('<li>').text(msg)); 
      }); 
     }); 

ich glaube, der Schalter selbst funktioniert, weil die Anschluss- und disconnect auslösenden Ereignisse sind, wie sie sollten. Aber wenn es darum geht, die Nachricht (der Server, der bereits vom Client empfangen wurde) an alle im selben Namespace zu senden, funktioniert es nicht.

Isnt dies der serversided Aufruf in einem bestimmten Namensraum emittiert ?:

io.of('namespace').emit(); 

Versteh ich die Verwendung von Namensräumen? Ich wollte Räume direkt nach dem Namespace-Split der 2 Maintchs für Support und Freunde implementieren. Oder habe ich die Namespaces auf der Serverseite falsch implementiert? Ich dachte, io.on (..), io.of ('/ support') am (..) und io.of ('/ friends') am (..) arbeiten alle gleich und fangen die Ereignisse ihrer eigenen Namespaces-Clients.

Jede Hilfe wird sehr geschätzt! Ich habe das Gefühl, dass Namespaces in den "Basic-Usage" Dokumentationen etwas vernachlässigt wurden.

Antwort

0

Sie können Namespaces für eine bestehende Verbindung nicht "umschalten". Sie stellen eine Verbindung zu einem bestimmten Namespace her, wenn die Verbindung hergestellt und einmal hergestellt wurde, sie kann nicht geändert werden.

Sie können die aktuelle Verbindung löschen und eine Verbindung zu einem neuen Namespace mit einer neuen Verbindung herstellen. Wenn Sie jedoch Ihre Anwendung verwenden, missbrauchen Sie das Konzept der Namespaces, wenn Sie Namespaces wechseln und stattdessen Räume verwenden möchten.

Für Räume kann der Client dem Server eine Anfrage senden, Räume zu wechseln, und der Server kann den Benutzer dann aus einem vorhandenen Raum entfernen und sie zu einem neuen Raum hinzufügen. Dann können Sie vom Server aus einfach auf alle Verbindungen in einem bestimmten Raum übertragen.

In der Tat wurden Räume um das Konzept des Chats erfunden (obwohl sie viele andere Anwendungen haben), so dass sie perfekt für die Chat-Räume geeignet sind, die Sie implementieren möchten.

Namensräume sind schwerer als die Räume. Eine Verbindung muss eine Verbindung zu einem bestimmten Namespace herstellen, wenn die Verbindung hergestellt wird und während der Verbindung nicht geändert werden kann.

Zimmer sind auf der anderen Seite viel flexibler. Der Server kann jederzeit eine Verbindung herstellen, eine Verbindung zu einem Raum hinzufügen oder entfernen und eine Verbindung kann sogar in mehreren Räumen bestehen.

Beide Räume und Namespaces unterstützen die Übertragung an alle Benutzer in dieser Sammlung.

Ich denke Namespaces mehr wie Kanäle der Funktionalität. Also möchte ich mich mit dem Namespace "Preis" verbinden, um Benachrichtigungen über Preisänderungen zu erhalten, oder ich würde eine Verbindung zum Namespace "System" herstellen, um Warnungen über Dinge zu erhalten, die im System passieren oder um Nachrichten zu senden Dinge im System verwalten.

Während Räume willkürliche Sammlungen von Benutzern sind, die daran interessiert sind, Informationen zu teilen, und ich in mehr als einem Raum sein kann.

+0

Dies ist eine wunderbare Antwort und genau das, was ich wissen musste! Danke vielmals! – ExaMa