socket.ioで任意のユーザの接続を切る「Kick処理」を実装する

 リアルタイムなコミュニケーションサービスを出すとなると必要になってくるのがKickです.変なユーザにずっと居座られていてはたまったものではありません.

 ただ,この方法全然情報がなくて困りました.接続をしてきたユーザ自身を切るのは簡単なんですよね.socket.disconnect()という具合で.

http://memo.yomukaku.net/entries/290

 とりあえず適当やったらできたので書き残しておきます.

 ずばり書くと,こうします.

io.sockets['ここにKickしたいユーザのソケットID'].disconnect();

 socket.ioオブジェクトである「io」の中にあるsocketsプロパティにアクセスすると,そこには現在コネクションしているユーザすべてのオブジェクトが,配列で格納されています.その配列をSocketIDで引き,disconnect()関数を実行すれば,接続を切断でき,Kick完了となります!

じゃあKickしたいユーザのソケットIDってなんだよ?となりますが,これはSocket.ioが管理しているIDのことです.どうやってとるのかというと,

var io = socketio.listen(http.createServer(app).listen(app.get('port')),function() {
    console.log("Express server & socket.io listening on port " + app.get('port'));
});

var room = io.of('/room').on('connection',function(socket) {//of('/room')は名前空間の定義
    var user_socket_id = socket.id;//たった今接続してきたユーザのsocketIdをとる
    console.log("今接続してきたユーザのSocketIDは,"+user_socket_id+"です");
});

こうしてとることができます.このIDをサーバの変数とか,データベースとかに保存しておいて,Kickするときに使えば,好きなユーザのコネクションを解除することが可能です.

実際に使う時の具体例はこんなかんじです.例えば,各名前空間にわかれているsocket.ioの処理を書いていて,そこでKickをしたいとします.

var io = socketio.listen(http.createServer(app).listen(app.get('port')),function() {
    console.log("Express server & socket.io listening on port " + app.get('port'));
});

var room = io.of('/room').on('connection',function(socket) {
    socket.on('chat' , function (kick_user_name) {
        //なんか色々処理があるとする
        //そしてユーザをキックしたいとする
        mongo.getUserId(kick_user_name, function(socket_id){//ここの処理は,
            //要するにキックしたいユーザのsocket_idをとっているということです.

            //取ってきたsocket_idを元にコネクションを切断する
            //自分自身を切断するのはsocket.disconnect()だ.
            //socketには接続してきたユーザ自身の情報のみが格納されている.
            //現在,socket.ioに接続中なすべてのユーザの情報は,このコードの場合だと
            //roomに格納されている.
            room.sockets[socket_id].disconnect();
         });
    });

});

 にしても,どう考えても必須の機能だと思うし,公式ドキュメントにちゃんと書いておいて欲しいですねえ...