Socket.io-namespaces

提供:Dev Guides
移動先:案内検索

Socket.IO-名前空間

Socket.IOでは、ソケットを「名前空間」にすることができます。これは、本質的には、異なるエンドポイントまたはパスを割り当てることを意味します。 これは、リソース(TCP接続)の数を最小限に抑え、同時に通信チャネル間の分離を導入することにより、アプリケーション内の懸念を分離するのに役立つ機能です。 複数の名前空間が実際に同じWebSocket接続を共有するため、サーバーのソケットポートが節約されます。

名前空間はサーバー側で作成されます。 ただし、サーバーに要求を送信することにより、クライアントによって結合されます。

デフォルトの名前空間

ルート名前空間「/」はデフォルトの名前空間であり、サーバーへの接続中にクライアントが名前空間を指定しない場合、クライアントによって結合されます。 ソケットオブジェクトのクライアント側を使用したサーバーへのすべての接続は、デフォルトのネームスペースに対して行われます。 たとえば-

var socket = io();

これにより、クライアントがデフォルトのネームスペースに接続されます。 この名前空間接続のすべてのイベントは、サーバー上の* ioオブジェクト*によって処理されます。 前の例はすべて、デフォルトのネームスペースを使用してサーバーとやり取りするものでした。

カスタム名前空間

独自のカスタム名前空間を作成できます。 カスタム名前空間を設定するには、サーバー側で「of」関数を呼び出します-

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res) {
   res.sendfile('indexl');
});

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

http.listen(3000, function() {
   console.log('listening on localhost:3000');
});

ここで、クライアントをこのネームスペースに接続するには、ネームスペースを引数として* ioコンストラクター呼び出し*に提供し、クライアント側で接続とソケットオブジェクトを作成する必要があります。

たとえば、上記の名前空間に接続するには、次のHTMLを使用します-

<!DOCTYPE html>
<html>
   <head>
      <title>Hello world</title>
   </head>
   <script src = "/socket.io/socket.io.js"></script>

   <script>
      var socket = io('/my-namespace');
      socket.on('hi',function(data) {
         document.body.innerHTML = '';
         document.write(data);
      });
   </script>
   <body></body>
</html>

誰かがこの名前空間に接続するたびに、「こんにちは」イベントを受け取ります。