2017-11-17 17 views
0

私は2つのソケットサーバーを別々のマシンで実行しています。ソケットioは2つの異なるユーザータイプを扱います

// Customers 
io.on('connection', function (socket) { 

    socket.on(REQUEST, function (callback) { 
     result = 'OK'; 
     callback(result); 
    }); 
}); 

// Suppliers 
// another socket server running on another instance 

io.on('connection',function (socket) { 

    socket.on(PRODUCTS, function (callback) { 
     result = 'OK'; 
     callback(result); 
    }); 
}); 

2つのサーバーの間にマッピングがないと、サーバー間で通信できないことがわかります。

シングルソケットサーバー上で2種類のユーザーを区別するにはどうすればよいですか。 ? (私たちは一意のソケットIDを持っており、マッピングは必要ありません)

答えて

1

私はあなたの問題を理解していません。同じソケットに接続されている異なるユーザーを区別する必要がある場合は、「部屋」の概念を使用できます。異なるエンドポイントを提供する必要がある場合は、名前空間を使用できます。

私は、ドキュメントから、ここでの例を総括ます:

部屋

あなたが与えられたチャネルにソケットを購読する参加呼び出すことができます。

io.on('connection', function(socket){ 
    socket.join('some room'); // At user login maybe you can decide if 
          // the user should join the customer or suppliers 
          // room, or both if you need to 
}); 

そして単に使用または(同じです):

io.to('some room').emit('some event'); 

チャンネルから離脱する場合は、参加と同じ方法で離脱します。

各ネームスペース内で、ソケットが参加したり離れることができる任意のチャネルを定義することもできます。各接続はデフォルトのチャンネルに参加し、ブロードキャストに便利です。一度切断すると、socketIdは彼が参加した部屋を自動的に残します。

io.on('connection', function(socket){ 
    socket.on('say to someone', function(id, msg){ 
    // Useful to broadcast to every connected socket 
    socket.broadcast.to(id).emit('my message', msg); 
    }); 
}); 

名前空間

基本的に我々は異なるエンドポイントを定義することができ、デフォルト一つは '/' です。

サーバー側

、あなたのアプリケーションに到達することができ、多くのnamepaces(エンドポイント)を定義することができ、サーバを起動します。それらのすべては、あなたが宣言された名前空間に接続する必要があり、さまざまなイベントを持っていると、クライアント側では

var nsp = io.of('/my-namespace'); 
nsp.on('connection', function(socket){ 
    console.log('someone connected'); 
}); 
nsp.emit('hi', 'everyone!'); 

クライアント側

をビヘイビアも

var socket = io('/my-namespace'); 

https://socket.io/docs/rooms-and-namespaces/

+0

すべてが1対1のデータ転送です。しかし、私はさまざまなタイプのユーザーのソケットイベントを検証する必要があります。ユーザーのタイプに基づいて私はロジックを持っています。私はイベント内でユーザータイプを簡単にチェックしたくない。 –

+0

特定のユーザー(他の名前空間ユーザー)にイベントを送信したい場合は、名前空間を使用します。どのようにできるのか ? io.to(conId).emit( 'someEvent'、data)?名前空間を定義する必要はありますか? –

+0

私は、その場合はおそらく部屋を選ぶでしょう。ユーザーがログインすると、顧客またはサプライヤルームに参加する必要があります。その後、彼は汎用イベントをソケットに送信し、顧客固有のイベントは顧客ルームに送信します。サプライヤにとっても同じことです。しかし、参加する部屋を決定するためにユーザータイプを確認する必要があります。 – sabau

0

ソケット接続の前にしてもよいですパラメータをとり、そのuser_typeを仮定します。サーバーサイドでは、あなたがして、そのパラメータを取得することがあります。

io.sockets.on('connection', function (socket) { 
    var user_type =socket.handshake.query.user_type; 
} 

とクライアント側で次のような接続を開始することができる:

io.connect("<>"",{path:"/socket.io",query:"user_type=<your_user_type}); 

をそしてあなたは、ユーザーのさまざまなタイプのためにやりたいことがあります。さまざまな部屋に接続したり、ハッシュマップを保持してどのsocketidがどのユーザタイプに属するかに関する情報を得ることができます

+0

クライアントサイドのユーザータイプに依存することは安全ではなく、推奨されていません。 –

+0

私は本当にあなたがuser_typeの意味を知らない。パラメータを渡すことをお勧めします。クライアント側からトークンを渡してユーザーを認証し、そのトークンを使用して関連情報を取得する可能性があります。 – kundante

+0

はい、そのようにしてユーザータイプを取得できます。どのように各イベントを検証できますか? ?一部のイベントは、ユーザータイプ1およびその他のユーザータイプ2にのみ属します。私は、各イベントの中でユーザータイプをチェックするというアイデアは気に入らない。それでは、一般的なセットアップに差別化を依頼したのはなぜですか? –