リアルタイムなコミュニケーションサービスを出すとなると必要になってくるのが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(); }); }); });
にしても,どう考えても必須の機能だと思うし,公式ドキュメントにちゃんと書いておいて欲しいですねえ...