{"id":99,"date":"2013-07-11T16:51:54","date_gmt":"2013-07-11T07:51:54","guid":{"rendered":"http:\/\/www.rocher.kyoto.jp\/araburu\/?p=99"},"modified":"2013-07-19T01:01:10","modified_gmt":"2013-07-18T16:01:10","slug":"websocketjsr-356%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b%e3%80%82%e3%81%9d%e3%81%ae3","status":"publish","type":"post","link":"https:\/\/www.rocher.kyoto.jp\/arbr\/?p=99","title":{"rendered":"WebSocket(JSR 356)\u3092\u4f7f\u3063\u3066\u307f\u308b\u3002\u305d\u306e3"},"content":{"rendered":"<p><a title=\"WebSocket(JSR 356)\u3092\u4f7f\u3063\u3066\u307f\u308b\u3002\u305d\u306e2\" href=\"https:\/\/www.rocher.kyoto.jp\/araburu\/?p=69\">\u3053\u308c\u307e\u3067<\/a>\u306b\u5f15\u304d\u7d9a\u304dWebSocket\u3092\u8a66\u3057\u3066\u307f\u308b\u3002<\/p>\n<p>API\u3092\u307f\u308b\u3068<code><strong><a href=\"http:\/\/docs.oracle.com\/javaee\/7\/api\/javax\/websocket\/Session.html#getOpenSessions%28%29\">getOpenSessions<\/a><\/strong>()\u3068\u3044\u3046\u30e1\u30bd\u30c3\u30c9\u304c\u3042\u308a\u3001\u305d\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u7d10\u4ed8\u304f\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u53d6\u308c\u308b\u3068\u306e\u3053\u3068\u3002\u307e\u305f\u3001<a href=\"https:\/\/javaee-spec.java.net\/nonav\/javadocs\/javax\/websocket\/OnMessage.html\">OnMessage\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u8aac\u660e<\/a>\u306b\u3088\u308b\u3068POJO\u306e\u30e1\u30bd\u30c3\u30c9\u5f15\u6570\u306bSession\u3092\u30aa\u30d7\u30b7\u30e7\u30ca\u30eb\u306a\u5f15\u6570\u3068\u3057\u3066\u6e21\u305b\u308b\u3068\u306e\u3053\u3068\u3002<\/code><\/p>\n<p>\u4e0b\u306e\u3088\u3046\u306b\u5f15\u6570\u306b\u30bb\u30c3\u30b7\u30e7\u30f3\u3092\u8ffd\u52a0\u3057\u3066\u3084\u3063\u3066\u3001\u305d\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u304b\u3089getOpenSessions\u3092\u547c\u3093\u3067\u3084\u308c\u3070\u5bfe\u5411\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308c\u305f\u3002<\/p>\n<pre>package hp.co.epea.first;\r\n\r\nimport java.util.Set;\r\n\r\nimport javax.websocket.OnClose;\r\nimport javax.websocket.OnMessage;\r\nimport javax.websocket.OnOpen;\r\nimport javax.websocket.Session;\r\nimport javax.websocket.server.ServerEndpoint;\r\n\r\n@ServerEndpoint(\"\/hello\")\r\npublic class HelloWorld {\r\n\r\n<span style=\"color: #008000;\">\/* \r\n * sessionOfEndPoint\u3068sessionOfClientEndPoint\u3068\u3044\u3046\u540d\u524d\u306b\u306a\u3063\u3066\u3044\u308b\u3051\u3069\r\n * \u52d8\u9055\u3044\u3057\u3066\u3044\u305f\u3053\u3068\u306b\u3088\u308b\u3088\u304f\u306a\u3044\u540d\u524d\u3002\r\n * \u5f15\u6570\u306eSession\u306f\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51fa\u3057\u305fPeer\u3068\u53d7\u3051\u53d6\u3063\u305fPeer\u9593\u306eSession\u306a\u306e\u3067\r\n * sessionOfCurrentReq\u307f\u305f\u3044\u306a\u3082\u306e\u3002\r\n * getOpenSessions\u3067\u53d6\u5f97\u3067\u304d\u308b\u306e\u306f\u305d\u306esession\u304c\u6301\u3064endPoint\u306b\u7d10\u4ed8\u304f\u3084\u3064\u306a\u306e\u3067\r\n * sessionOfRelated\u307f\u305f\u3044\u306a\u3082\u306e\u304c\u672c\u6765\r\n *\/<\/span>\r\n\u00a0\u00a0 \u00a0@OnMessage\r\n\u00a0\u00a0 \u00a0public void onMessage(String message,<span style=\"color: #ff0000;\">Session<\/span> sessionOfSvEndPoint) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Set&lt;Session&gt; sessionsOfClientEndPoint = sessionOfSvEndPoint.<span style=\"color: #ff0000;\">getOpenSessions<\/span>();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"sessionsOfClientEndPoint.size():\" +sessionsOfClientEndPoint.size());\r\n        System.out.println(\"message[\" + message + \"]\");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (Session s : sessionsOfClientEndPoint) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0s.getAsyncRemote().sendText(message);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@OnOpen\r\n\u00a0\u00a0 \u00a0public void open(Session sess) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"\u958b\u59cb\u3057\u307e\u3059\uff1a\" + sess.getId());\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@OnClose\r\n\u00a0\u00a0 \u00a0public void close(Session sess) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"\u7d42\u4e86\u3057\u307e\u3059\uff1a\" + sess.getId());\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 @OnError\r\n\u00a0\u00a0\u00a0 public void error(Session sess, Throwable t) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println(\"\u30a8\u30e9\u30fc\u3067\u3059\uff1a\" + sess.getId());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 t.printStackTrace();\r\n\u00a0\u00a0\u00a0 }\r\n}<\/pre>\n<p>\u203b<a href=\"http:\/\/ihiroky.hatenablog.com\/entry\/2013\/06\/25\/013134\">\u4ed6\u306e\u65b9\u304c\u66f8\u3044\u3066\u3044\u308b\u8a18\u4e8b<\/a>\u3092\u767a\u898b<\/p>\n<p>\u5bfe\u5411\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u304c\u9589\u3058\u3089\u308c\u305f\u5834\u5408\uff08\u3053\u3061\u3089\u306eOnClose\u304c\u7d42\u308f\u3063\u305f\u3089\uff1f\uff09\u305d\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306f\u306a\u3044\u3082\u306e\u3068\u6271\u308f\u308c\u3066\u3044\u308b\u3002<\/p>\n<pre><em>\uff083\u3064\u958b\u3044\u3066\u3044\u308b\uff09<\/em>\r\n\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a07d672db-af64-435c-a272-2698528927f1\r\n\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a91202881-63ac-45b8-a3a1-d53e7bdc2008\r\n\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a628fc0c0-9cde-4812-a12b-d2ce52cc146e\r\n\u60c5\u5831: sessionsOfClientEndPoint.size():<span style=\"color: #ff0000;\">3<\/span>\u3000<span style=\"color: #ff0000;\">&lt;-\u958b\u3044\u3066\u3044\u308b\u6570<\/span>\r\n\u60c5\u5831: message[\u3042\u3042\u3042]\r\n<em>(1\u3064\u9589\u3058\u30662\u500b\u306b\u3059\u308b)<\/em>\r\n\u60c5\u5831: \u7d42\u4e86\u3057\u307e\u3059\uff1a628fc0c0-9cde-4812-a12b-d2ce52cc146e\r\n\u60c5\u5831: sessionsOfClientEndPoint.size():<span style=\"color: #ff0000;\">2<\/span>\u3000<span style=\"color: #ff0000;\">&lt;-\u958b\u3044\u3066\u3044\u308b\u6570<\/span>\r\n\u60c5\u5831: message[\u3044\u3044\u3044]<\/pre>\n<p>\u305f\u3060\u3053\u306e\u3084\u308a\u65b9\u3060\u3068sessionOfSvEndPoint.getOpenSessions()\u3057\u3066\u304b\u3089for\u6587\u304c\u56de\u3063\u3066\u3044\u308b\u9593\u306b\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u304c\u9589\u3058\u3089\u308c\u308b\u3068\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30af\u30ed\u30fc\u30ba\u6e08\u307f\u30a8\u30e9\u30fc\u304c\u98db\u3093\u3067\u3057\u307e\u3046\u3002<a title=\"WebSocket(JSR 356)\u3092\u4f7f\u3063\u3066\u307f\u308b\u3002\u305d\u306e2\" href=\"https:\/\/www.rocher.kyoto.jp\/araburu\/?p=69\">\u524d\u306e\u66f8\u304d\u65b9<\/a>\u306e\u307b\u3046\u304c\u3044\u3044\u306e\u304b\u306a\u3002<\/p>\n<pre>\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a68d4f179-7c99-4118-b829-f48f7fc9d670\r\n\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a83ccdfea-f0b8-4dc5-8cc3-3d9bddebc658\r\n\u60c5\u5831: sessionsOfClientEndPoint.size():2 <span style=\"color: #ff0000;\">&lt;-\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u30b3\u30d4\u30fc\u3092\u3068\u308b<\/span>\r\n\u60c5\u5831: message[a]\r\n\u60c5\u5831: \u7d42\u4e86\u3057\u307e\u3059\uff1a83ccdfea-f0b8-4dc5-8cc3-3d9bddebc658 <span style=\"color: #ff0000;\">&lt;-for\u6587\u306e\u524d\u306b(or\u9014\u4e2d\u3067)\u9589\u3058\u308b<\/span>\r\n\u60c5\u5831: \u30a8\u30e9\u30fc\u3067\u3059\uff1a<span style=\"color: #008000;\"><strong>68d4f179-7c99-4118-b829-f48f7fc9d670<\/strong>\u3000&lt;- OnError\u306e\u5f15\u6570\u3067\u5165\u3063\u3066\u304f\u308b\u306e\u306f\u5b9f\u969b\u306b\u4f8b\u5916\u306e\u539f\u56e0\u3068\u306a\u3063\u305f\u3082\u306e\u3067\u306a\u304f\u3066Onmessage\u3092\u547c\u3093\u3060Session\u306e\u6a21\u69d8\u3002<\/span>\r\n\u91cd\u5927: java.lang.IllegalStateException: The connection has been closed.\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.SessionImpl.checkConnectionState(SessionImpl.java:343)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.SessionImpl.getAsyncRemote(SessionImpl.java:180)\r\n\u00a0\u00a0 \u00a0at hp.co.epea.first.HelloWorld.onMessage(HelloWorld.java:22)\r\n\u00a0\u00a0 \u00a0at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\u00a0\u00a0 \u00a0at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)\r\n\u00a0\u00a0 \u00a0at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\u00a0\u00a0 \u00a0at java.lang.reflect.Method.invoke(Method.java:606)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:431)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.AnnotatedEndpoint.access$100(AnnotatedEndpoint.java:83)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.AnnotatedEndpoint$WholeHandler$1.onMessage(AnnotatedEndpoint.java:518)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.SessionImpl.notifyMessageHandlers(SessionImpl.java:389)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.EndpointWrapper.onMessage(EndpointWrapper.java:495)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.server.TyrusEndpoint.onMessage(TyrusEndpoint.java:174)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.websockets.DefaultWebSocket.onMessage(DefaultWebSocket.java:156)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.websockets.frametypes.TextFrameType.respond(TextFrameType.java:66)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.websockets.DataFrame.respond(DataFrame.java:102)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.servlet.TyrusHttpUpgradeHandler.onDataAvailable(TyrusHttpUpgradeHandler.java:113)\r\n\u00a0\u00a0 \u00a0at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.processDataAvailable(InputBuffer.java:488)\r\n\u00a0\u00a0 \u00a0at org.apache.catalina.connector.InputBuffer$ReadHandlerImpl.onDataAvailable(InputBuffer.java:453)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.http.io.InputBuffer.append(InputBuffer.java:855)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:222)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)\r\n\u00a0\u00a0 \u00a0at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)\r\n\u00a0\u00a0 \u00a0at java.lang.Thread.run(Thread.java:724)<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u308c\u307e\u3067\u306b\u5f15\u304d\u7d9a\u304dWebSocket\u3092\u8a66\u3057\u3066\u307f\u308b\u3002 API\u3092\u307f\u308b\u3068getOpenSessions()\u3068\u3044\u3046\u30e1\u30bd\u30c3\u30c9\u304c\u3042\u308a\u3001\u305d\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u7d10\u4ed8\u304f\u30bb\u30c3\u30b7\u30e7\u30f3\u304c\u53d6\u308c\u308b\u3068\u306e\u3053\u3068\u3002\u307e\u305f\u3001OnMessage\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u8aac\u660e\u306b\u3088 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[70,7],"class_list":["post-99","post","type-post","status-publish","format-standard","hentry","category-javaee","tag-javaee","tag-jsr-356"],"_links":{"self":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/99","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=99"}],"version-history":[{"count":9,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/99\/revisions"}],"predecessor-version":[{"id":180,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/99\/revisions\/180"}],"wp:attachment":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=99"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=99"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=99"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}