2

以下は、動的に割り当てられた名前空間を処理するための私のコードです。クライアントは接続し、リファラーを使用してクライアントのアカウントIDを検索します。以下にない関数で、そのアカウントIDにまだ名前空間が割り当てられていない場合は、新しい名前空間が生成されます(UUID)。既存の名前空間が返されます。

次に、その名前空間がクライアントに発行され、クライアントはconnectその特定の名前空間に関する新しいメッセージで順番に応答します。

これはすべて機能します。

残念ながら、ns_socket.emit('hi');多くのクライアントが接続している場合でも、ステートメントはns_socketに返されます。

明確にするために、クライアント1が名前空間に接続する場合、hiはそのクライアントに対して1回起動されます。クライアント2が同じ名前空間に接続すると、hi(私には)不明な理由で2番目のクライアントに2回起動されますが、1回だけ起動する必要があります。

どんな助けでも、明らかに、非常にありがたいです。

var main = io.of('').on('connection', function(socket) {
    socket.on('joinDynNs',function(data) {
        var nameslug = socket.handshake.headers.referer.match(/(http(s)?:\/\/)([A-Za-z0-9-]+)\./)[3];
        getActID(nameslug, function(actID) {
            var ns = getNamespace(nS, actID);
            socket.emit('assignNamespace',{ns:ns});
            io.of('/' + ns).on('connection', function(ns_socket) {
                ns_socket.emit('hi');
            });
        });
    });
});
4

1 に答える 1

3

ロジックは、ソケットがベース名前空間に接続するたびに名前空間の接続ハンドラーが作成されるように記述されています。したがって、新しいクライアントがベース名前空間に接続するたびに、別の接続ハンドラーを設定します。言い換えれば、あなたは呼んでいます

io.of('/' + ns).on('connection', function(ns_socket) {
    ns_socket.emit('hi');
});

新しい接続が着信するたび。接続ハンドラーは、処理しているソケットに固有のものではありません。名前空間上の新しい接続に対して起動します。これが、メッセージ数の増加が見られる理由です。

あなたのニーズを完全に理解することはできませんが、部屋はあなたにとってより良い解決策になると思います。名前空間は、実際には多重化接続に使用するように設計されています(たとえば、同じSocket.IOポートで実行されている複数の完全に無関係なアプリ)。ルームを使用すると、ソケットを論理グループにグループ化し、そのグループのソケットにメッセージを送信できます。

于 2012-11-28T08:17:14.823 に答える