2017-12-30 50 views
2

私は現在socket.ioと簡単なチャットをしています。基本はすでに動作していますが、今は2つの異なる名前空間を実装しようとしています。私は、クライアントがボタンクリックで1つの名前空間(サポートチャット)から他の(フレンドチャット)に切り替えることができるようにしたい。socket.io名前空間を切り替える

サーバーサイド

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

クライアント側

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

彼らが必要のようconnection-と切り離し、イベントがトリガされているので、私は、スイッチ自体が機能していると思います。しかし、同じ名前空間の全員にメッセージ(クライアントから受信したサーバー)を送信することになると、それは機能しません。

ありえないこの特定の名前空間に放出するためのserversidedコール?:

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

は私が名前空間の使用法を誤解していますか?私は、サポートと友人のための2つのメインチャットの名前空間 - 「分割」の直後に部屋を実装したかったのです。 または、サーバー側で間違った名前空間を実装しましたか?私はio.on(..)、io.of( '/ support')とon(..)とio.of( '/ friends')のon ..(..)はすべて同じ方法で動作し、独自のネームスペースのイベント - クライアント。

ご協力いただきありがとうございます。私は、名前空間が「基本的な使用法」の文書で無視されているように感じます。

答えて

0

既存の接続で名前空間を「切り替える」ことはできません。特定のネームスペースに接続すると、そのネームスペースに接続して作成すると変更できません。

現在の接続を切断し、新しい接続で新しい名前空間に接続できます。しかし、アプリケーションがあれば、名前空間を切り替える必要があり、代わりに部屋を使用する必要がある場合は、名前空間の概念を誤っています。

ルームの場合、クライアントはサーバーにルームの切り替え要求を送信することができ、サーバーは既存のルームからユーザーを削除して新しいルームに追加することができます。その後、サーバーから、特定の部屋のすべての接続に簡単にブロードキャストできます。

実際には、部屋はチャットのコンセプトを中心に作成されています(他の用途もありますが)ので、実装したいチャットルームに最適です。

名前空間は、部屋より重い重量区分です。接続は、接続が行われたときに特定の名前空間に接続する必要があり、接続中は変更できません。

部屋の方がはるかに柔軟です。サーバーは、任意の接続をいつでも追加または削除することができ、複数の部屋に接続することもできます。

ルームと名前空間の両方が、そのコレクション内のすべてのユーザーにブロードキャストをサポートします。

私は、より多くの機能性チャネルのような名前空間を考えています。だから、私は価格変更の通知を得るために "価格"変更名前空間に接続したい、またはシステム内で起こっている事柄に関するアラートを取得したり、メッセージを送るために "システム"名前空間に接続したいシステム内のものを管理する。

部屋は情報の共有に興味のある任意のユーザーの集まりであり、複数の部屋にいる可能性があります。

+0

これはすばらしい答えであり、正確に私が知る必要があったものです!どうもありがとう! – ExaMa