私はNode(Express)とSocket.IOでチャット機能を備えたWebアプリケーションを構築しています。ページ上に新しいタブを開くと新しいソケット接続が確立されるため、エクスプレスセッションIDに基づいて単一のユーザーのすべてのインスタンスを自分の部屋にグループ化して、そのユーザーを対象とするすべてのメッセージをすべての重複タブに表示できるようにする必要があります。これは、既にログインしている他のルーム/チャンネルに追加されています。少なくとも、実際の「実際」の部屋と、sessionIDを使用する自分のチャンネルの2つのチャットルームにユーザが登録されています。Socket.IOでルーム/チャンネルのサブセットに送信
問題は、私のsessionIDのすべてのソケットが、より一般的な部屋にあり、他のユーザーからのメッセージを取得する必要があるということです。私が一般的なチャットメッセージを送信するとき、彼らは自分のチャンネルを介してすでにメッセージを受信しているので、送信ユーザに対応するソケットは省略したいと思います。私は先に行って、そのセッションのsocketIDのリストを含む配列のハッシュを作成しました。これはsessionIDをキーにしています。私は例外リストを指定するためのいくつかの異なる構文を見てきましたが、私にとってはうまくいくものはありません。簡潔にするため省略し、特定の部品と
関連するコード、:
var sessionSockets = {};
io.sockets.on('connection', function(socket){
if(!io.sockets.manager.rooms["/" + sessionID]) {
sessionSockets[sessionID] = [];
//send message indicating log on to all sockets except for my session
}
socket.join(sessionID); //create private channel for all sockets of the same sessionID
sessionSockets[sessionID].push(socket.id);
socket.on('chat', function(data){
var payload = {
message: data.msg,
from: data.user
};
//send back as personal message to all sockets for this session
io.sockets.in(sessionID).emit('me',payload);
//send to everyone else as regular message; WHAT SYNTAX?
io.sockets.in('').except(sessionSockets[sessionID]).emit('chat', payload);
}
}
TL; DRは:どのように私は手動で配列の比較を行うことなく、チャネル/客室内のユーザーのサブセットにメッセージを送ることができますか?
なぜあなた自身にメッセージを最初に送信しますか?なぜ、元のソケットではないすべてのソケットにブロードキャストするだけではないのですか?あなたが自分で持っている他のすべてのタブは、このようにしてメッセージを受信します。 – slacktracer