{"id":3654,"date":"2015-01-16T19:02:56","date_gmt":"2015-01-16T10:02:56","guid":{"rendered":"http:\/\/www.lancard.com\/blog\/?p=3654"},"modified":"2025-03-12T11:28:06","modified_gmt":"2025-03-12T02:28:06","slug":"socket-io%ef%bc%9a%e3%83%9e%e3%83%ab%e3%83%81%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%aenode-js%e3%81%a7%e3%80%81room%e3%81%ab%e5%85%a5%e5%ae%a4%e3%81%97%e3%81%9f%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2","status":"publish","type":"post","link":"https:\/\/www.lancard.com\/blog\/2015\/01\/16\/socket-io%ef%bc%9a%e3%83%9e%e3%83%ab%e3%83%81%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%aenode-js%e3%81%a7%e3%80%81room%e3%81%ab%e5%85%a5%e5%ae%a4%e3%81%97%e3%81%9f%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2\/","title":{"rendered":"Socket.IO\uff1a\u30de\u30eb\u30c1\u30d7\u30ed\u30bb\u30b9\u306enode.js\u3067\u3001Room\u306b\u5165\u5ba4\u3057\u305f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u4e00\u89a7\u3092\u53d6\u5f97\u3059\u308b"},"content":{"rendered":"<p>\u30c1\u30e3\u30c3\u30c8\u7b49\u3067\u3001Room\u306b\u8ab0\u304c\u5165\u5ba4\u3057\u3066\u3044\u308b\u306e\u304b\u3092\u77e5\u308b\u969b\u306e\u65b9\u6cd5\u3067\u3059\u3002<br \/>\nRoom\u306b\u5165\u5ba4\u3057\u305f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\uff08socket id\uff09\u4e00\u89a7\u306e\u53d6\u5f97\u306f\u3001socket.io 1.0\u4ee5\u964d\u3067\u306f\u4ee5\u4e0b\u3067\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre lang=\"coffee\">\nio.nsps[yourNamespace].adapter.rooms[roomName]\n<\/pre>\n<p>\u305f\u3060\u3057node.js\u3092\u30de\u30eb\u30c1\u30d7\u30ed\u30bb\u30b9\u3067\u5b9f\u884c\u3057\u3066\u3044\u308b\u5834\u5408\u3001\u81ea\u30d7\u30ed\u30bb\u30b9\u4ee5\u5916\u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u4e00\u89a7\u306f\u53d6\u5f97\u3067\u304d\u306a\u3044\u3067\u3059\u3002<br \/>\n\u305d\u306e\u305f\u3081Redis\u306eKVS\u3092\u4f7f\u3044\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>1.Room\u306b\u5165\u5ba4\uff1a<br \/>\n\u3000Redis\u306eKVS\u306b\u3001\u5404\u30d7\u30ed\u30bb\u30b9\u6bce\u306b\u3001\u5404\u30eb\u30fc\u30e0\u306b\u5165\u5ba4\u3057\u305f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\uff08socket id\uff09\u4e00\u89a7\u3092\u30bb\u30c3\u30c8<\/p>\n<pre lang=\"coffee\">\nredisClient = redis.createClient(redisPort, redisIp, {})\nprocess_name = localIp + 'p' + port # \u30d7\u30ed\u30bb\u30b9\u540d\uff1a\u30d7\u30ed\u30bb\u30b9\u306eIP\u3068\u30dd\u30fc\u30c8\u756a\u53f7\u3092\u7d50\u5408\u3057\u305f\u6587\u5b57\u5217\n\n#\n# socket\u3092room\u306bjoin\u3057\u3001\u4e14\u3064Redis\u306bset\u3059\u308b\n#\njoin = (socket, room)->;\n  socket.join room    # socket\u3092room\u306bjoin\n  key = room + ':' + process_name\n\n  value = []\n  if io.of('\/').adapter.rooms[room]?\n    for socketId of io.of('\/').adapter.rooms[room]\n      value.push socketId\n  redisClient.set key, JSON.stringify(value) # JSON\u306e\u6587\u5b57\u5217\u3068\u3057\u3066\u5024\u3092\u30bb\u30c3\u30c8\n  \n \nroomName = 'works#' + work_id\njoin socket, roomName\n<\/pre>\n<p>\u4e0b\u8a18\u306e\u3088\u3046\u306a\u611f\u3058\u3067Redis\u306b\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3059\u3002<\/p>\n<pre lang=\"bash\">\nredis 127.0.0.1:6379[1]> keys *\n1) \"users#558:10.0.2.15p1338\"\n2) \"works#1016:10.0.2.15p1337\"\n3) \"works#1016:10.0.2.15p1338\"\n4) \"users#10:10.0.2.15p1337\"\nredis 127.0.0.1:6379[1]> get works#1016:10.0.2.15p1337\n\"[\\\"1ZFRYWVeyrMPaiqOAAAD\\\"]\"\nredis 127.0.0.1:6379[1]> get works#1016:10.0.2.15p1338\n\"[\\\"vuturxDpPBL2ZHuLAAAK\\\"]\"\n<\/pre>\n<p>2.\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u4e00\u89a7\u3092\u53d6\u5f97\uff1a<br \/>\n\u3000Redis\u306eKVS\u304b\u3089\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u3092\u4f7f\u3063\u305fkeys\u30b3\u30de\u30f3\u30c9\u3067\u8a72\u5f53\u3059\u308b\u30ad\u30fc\u3092\u3059\u3079\u3066\u53d6\u5f97\u5f8c\u3001mget\u30b3\u30de\u30f3\u30c9\u3067\u5024\u3092\u53d6\u5f97<\/p>\n<pre lang=\"coffee\">\n#\n# roomID\u304b\u3089socket.id\u306e\u30ea\u30b9\u30c8\u3092\u53d6\u5f97\u3057\u3001\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\u5b9f\u884c\n#\nclients = (room, cb, opts) ->\n  key = room + ':*'\n  redisClient.keys key, (err, replies)->\n    redisClient.mget replies, (err, vals)->\n      socketIds = []\n      for val in vals\n        socketIds = socketIds.concat JSON.parse val\n      cb(socketIds, opts)\n\n\nroomName = 'works#' + work_id\nclients roomName, (socketIds)->\n  console.log 'Room\u306b\u5165\u5ba4\u3057\u3066\u3044\u308b\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u4e00\u89a7:' + socketIds.join(',')\n<\/pre>\n<p>3.Room\u304b\u3089\u9000\u5ba4\uff1a<br \/>\n\u3000Redis\u306eKVS\u306e\u5024\u3092\u5909\u66f4\u307e\u305f\u306f\u524a\u9664<\/p>\n<pre lang=\"coffee\">\n#\n# socket\u3092room\u304b\u3089leave\u3057\u3001\u4e14\u3064redis\u306bset\u3059\u308b\n#\nleave = (socket, room)->\n  socket.leave room\n  key = room + ':' + process_name\n\n  value = []\n  if io.of('\/').adapter.rooms[room]?\n    for socketId of io.of('\/').adapter.rooms[room]\n      value.push socketId\n  if value.length > 0\n    redisClient.set key, JSON.stringify(value)\n  else\n    redisClient.del key\n\nroomName = 'works#' + work_id\nleave socket, roomName\n<\/pre>\n<p>\u4e00\u5fdc\u3053\u308c\u3067\u5b9f\u73fe\u53ef\u80fd\u3067\u3059\u304c\u3001\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u4e00\u89a7\u53d6\u5f97\u3059\u308b\u305f\u3081\u3060\u3051\u306bredis\u306eKVS\u3092\u4f7f\u3046\u3068\u3044\u3046\u306e\u306f\u3001\u7121\u99c4\u306b\u30ea\u30bd\u30fc\u30b9\u3092\u4f7f\u3063\u3066\u3044\u308b\u611f\u3058\u3067\u3042\u307e\u308a\u3044\u3044\u65b9\u6cd5\u3067\u306f\u306a\u3044\u3088\u3046\u306b\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u611f\u3058\u3067\u30d7\u30ed\u30bb\u30b9\u7d42\u4e86\u6642\u306bredis\u306e\u30c7\u30fc\u30bf\u3092\u5168\u3066\u524a\u9664\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<pre lang=\"coffee\">\nfor signal in ['SIGINT', 'SIGHUP', 'SIGTERM']\n  process.on signal, ->\n    key = '*:' + process_name\n    redisClient.keys key, (err, replies)->\n      async.each replies, (reply)->\n        redisClient.del reply\n      process.exit 1\n      return\n<\/pre>\n<p>\u3082\u3063\u3068\u3044\u3044\u65b9\u6cd5\u304c\u3042\u308c\u3070\u3001\u8ab0\u304c\u6559\u3048\u3066\u9802\u3051\u305f\u3089\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-facebook nolightbox\" data-provider=\"facebook\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Facebook\" href=\"https:\/\/www.facebook.com\/sharer.php?u=https%3A%2F%2Fwww.lancard.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3654&#038;t=Socket.IO%EF%BC%9A%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AEnode.js%E3%81%A7%E3%80%81Room%E3%81%AB%E5%85%A5%E5%AE%A4%E3%81%97%E3%81%9F%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B&#038;s=100&#038;p&#091;url&#093;=https%3A%2F%2Fwww.lancard.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3654&#038;p&#091;images&#093;&#091;0&#093;=&#038;p&#091;title&#093;=Socket.IO%EF%BC%9A%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AEnode.js%E3%81%A7%E3%80%81Room%E3%81%AB%E5%85%A5%E5%AE%A4%E3%81%97%E3%81%9F%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"Facebook\" title=\"Share on Facebook\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.lancard.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/facebook.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"http:\/\/twitter.com\/share?url=https%3A%2F%2Fwww.lancard.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3654&#038;text=Socket.IO%EF%BC%9A%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AEnode.js%E3%81%A7%E3%80%81Room%E3%81%AB%E5%85%A5%E5%AE%A4%E3%81%97%E3%81%9F%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.lancard.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fwww.lancard.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3654&#038;title=Socket.IO%EF%BC%9A%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AEnode.js%E3%81%A7%E3%80%81Room%E3%81%AB%E5%85%A5%E5%AE%A4%E3%81%97%E3%81%9F%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.lancard.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-tumblr nolightbox\" data-provider=\"tumblr\" target=\"_blank\" rel=\"nofollow\" title=\"Share on tumblr\" href=\"https:\/\/tumblr.com\/share?s=&#038;v=3&#038;t=Socket.IO%EF%BC%9A%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AEnode.js%E3%81%A7%E3%80%81Room%E3%81%AB%E5%85%A5%E5%AE%A4%E3%81%97%E3%81%9F%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B&#038;u=https%3A%2F%2Fwww.lancard.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3654\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"tumblr\" title=\"Share on tumblr\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.lancard.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/tumblr.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Socket.IO%EF%BC%9A%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AEnode.js%E3%81%A7%E3%80%81Room%E3%81%AB%E5%85%A5%E5%AE%A4%E3%81%97%E3%81%9F%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E4%B8%80%E8%A6%A7%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B&#038;body=%E3%82%B7%E3%82%A7%E3%82%A2%E3%81%99%E3%82%8B%EF%BC%9A:%20https%3A%2F%2Fwww.lancard.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F3654\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.lancard.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>\u30c1\u30e3\u30c3\u30c8\u7b49\u3067\u3001Room\u306b\u8ab0\u304c\u5165\u5ba4\u3057\u3066\u3044\u308b\u306e\u304b\u3092\u77e5\u308b\u969b\u306e\u65b9\u6cd5\u3067\u3059\u3002 Room\u306b\u5165\u5ba4\u3057\u305f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\uff08socket id\uff09\u4e00\u89a7\u306e\u53d6\u5f97\u306f\u3001socket.io 1.0\u4ee5\u964d\u3067\u306f\u4ee5\u4e0b\u3067\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002 io.nsps[yourName [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[120,126],"tags":[],"class_list":["post-3654","post","type-post","status-publish","format-standard","hentry","category-node-js","category-socket-io-2"],"_links":{"self":[{"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/posts\/3654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/comments?post=3654"}],"version-history":[{"count":22,"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/posts\/3654\/revisions"}],"predecessor-version":[{"id":7813,"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/posts\/3654\/revisions\/7813"}],"wp:attachment":[{"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/media?parent=3654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/categories?post=3654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lancard.com\/blog\/wp-json\/wp\/v2\/tags?post=3654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}