{"id":113,"date":"2013-07-11T23:09:49","date_gmt":"2013-07-11T14:09:49","guid":{"rendered":"http:\/\/www.rocher.kyoto.jp\/araburu\/?p=113"},"modified":"2013-07-14T22:59:06","modified_gmt":"2013-07-14T13:59:06","slug":"websocket%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%ae4","status":"publish","type":"post","link":"https:\/\/www.rocher.kyoto.jp\/arbr\/?p=113","title":{"rendered":"WebSocket\u3092\u4f7f\u3063\u3066\u307f\u308b\u3002\u305d\u306e4"},"content":{"rendered":"<p>\u7d9a\u3051\u3066@PathParam\u3092\u8a66\u3057\u3066\u307f\u308b\u3002<br \/>\n<a href=\"https:\/\/javaee-spec.java.net\/nonav\/javadocs\/javax\/websocket\/server\/PathParam.html\">API<\/a>\u306b\u3088\u308b\u3068<br \/>\nServerEndpoint\u306b{<em>\u30d1\u30e9\u30e1\u30fc\u30bf<\/em>}\u3067\u6307\u5b9a\u3057\u305f\u5024\u3068\u30d0\u30a4\u30f3\u30c9\u3057\u3066\u304f\u308c\u308b\u3089\u3057\u3044\u3002<\/p>\n<p>\u5909\u6570\u3068\u3057\u3066\u4f7f\u3048\u308b\u578b\u306fString\u304b\u30d7\u30ea\u30df\u30c6\u30a3\u30d6Or\u305d\u306e\u30dc\u30af\u30b7\u30f3\u30b0\u578b\u3068\u306e\u3053\u3068\u3002<\/p>\n<p>\u305f\u3060\u3057\u3001\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u30c7\u30b3\u30fc\u30c9\u3067\u304d\u306a\u304b\u3063\u305f\u3089\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u547c\u3073\u51fa\u3059\u3089\u3057\u3044\u3002<\/p>\n<p>Java (zip:<a href=\"https:\/\/www.rocher.kyoto.jp\/araburu\/wp-content\/uploads\/2013\/07\/paramBindTest.zip\">paramBindTest<\/a>)<\/p>\n<pre>import javax.websocket.server.PathParam;\r\nimport javax.websocket.server.ServerEndpoint;\r\n\r\n@ServerEndpoint(\"\/hello\/<span style=\"color: #ff0000;\">{hoge}<\/span>\/<span style=\"color: #0000ff;\">{fuga}<\/span>\")\r\npublic class HelloWorld {\r\n\r\n\u00a0\u00a0 \u00a0static Set&lt;Session&gt; sessions = Collections\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0.synchronizedSet(new HashSet&lt;Session&gt;());\r\n\r\n\u00a0\u00a0 \u00a0@OnMessage\r\n\u00a0\u00a0 \u00a0public void onMessage(String message,\r\n           <span style=\"color: #ff0000;\">@PathParam(\"hoge\") Integer hoge<\/span>,<span style=\"color: #0000ff;\">@PathParam(\"fuga\") String fuga<\/span>) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"message[\" + message + \"]\");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"hoge[\" + hoge + \"]\");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"fuga[\" + fuga + \"]\");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (Session s : sessions) {\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}<\/pre>\n<p>JS<\/p>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $(document).ready(function(){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 var host=\"ws:\/\/localhost:8080\/first\/hello\/<span style=\"color: #ff0000;\">12<\/span>\/<span style=\"color: #0000ff;\">\u3042\u3042<\/span>\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 socket = new WebSocket(host);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 socket.onmessage = function(message){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $('#log').append(message.data + \"&lt;br\/&gt;\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/pre>\n<p>\u7d50\u679c<\/p>\n<pre>\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a8ca15fe1-a79d-420e-afc6-3c5ab18a75ec\r\n\u60c5\u5831: message[\u3042\uff53\uff44\uff46]\r\n\u60c5\u5831: hoge[<span style=\"color: #ff00ff;\">12<\/span>] <span style=\"color: #008000;\">&lt;- \u30dc\u30af\u30b7\u30f3\u30b0\u578b\u306b\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u3066\u3044\u308b<\/span>\r\n\u60c5\u5831: fuga[<span style=\"color: #0000ff;\">\u3042\u3042<\/span>] <span style=\"color: #008000;\">&lt;- \u65e5\u672c\u8a9e\u3082<\/span><span style=\"color: #008000;\">\u7d20\u76f4\u306b\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u308b\u6a21\u69d8<\/span><\/pre>\n<p>\u65e5\u672c\u8a9e\u3082\u305d\u306e\u307e\u307e\u3046\u307e\u304f\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u305f\u3002<\/p>\n<p>\u305f\u3081\u3057\u306bInteger\u306e\u90e8\u5206\u3092\u5c11\u6570\u306b\u3057\u305f\u3089NumberFormatException\u3092\u30c1\u30a7\u30fc\u30f3\u3057\u305fDecodeException\u304c\u767a\u751f\u3002\u3053\u306e\u30b1\u30fc\u30b9\u306f\u5207\u308a\u5206\u3051\u96e3\u3057\u304f\u306a\u3044\u3002<\/p>\n<pre>\u60c5\u5831: \u30a8\u30e9\u30fc\u3067\u3059\uff1a9366a9f2-2b24-4be3-8897-40427563d56e\r\n\u91cd\u5927: <span style=\"color: #ff0000;\">javax.websocket.DecodeException: Decoding failed<\/span>\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.PrimitiveDecoders$IntegerDecoder.decode(PrimitiveDecoders.java:165)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.PrimitiveDecoders$IntegerDecoder.decode(PrimitiveDecoders.java:157)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.AnnotatedEndpoint$2.value(AnnotatedEndpoint.java:362)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.AnnotatedEndpoint.callMethod(AnnotatedEndpoint.java:428)\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)\r\nCaused by: <span style=\"color: #ff00ff;\">java.lang.NumberFormatException: For input string: \"1.2\"<\/span>\r\n\u00a0\u00a0 \u00a0at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)\r\n\u00a0\u00a0 \u00a0at java.lang.Integer.parseInt(Integer.java:492)\r\n\u00a0\u00a0 \u00a0at java.lang.Integer.valueOf(Integer.java:582)\r\n\u00a0\u00a0 \u00a0at org.glassfish.tyrus.core.PrimitiveDecoders$IntegerDecoder.decode(PrimitiveDecoders.java:163)\r\n\u00a0\u00a0 \u00a0... 30 more<\/pre>\n<p>&nbsp;<\/p>\n<p>null\u3068\u3057\u305f\u5834\u5408\u3082\u7d20\u76f4\u306b\u30a8\u30e9\u30fc<\/p>\n<pre>var host=\"ws:\/\/localhost:8080\/first\/hello\/<span style=\"color: #ff0000;\">null<\/span>\/\u3042\u3042\";\r\n-&gt;\r\nCaused by: java.lang.NumberFormatException: For input string: \"<span style=\"color: #ff0000;\">null<\/span>\"<\/pre>\n<p>\u7a7a\u6587\u5b57\u3060\u3068\u3001\u4e88\u60f3\u5916\u306b\u7d20\u76f4\u306a\u30a8\u30e9\u30fc<\/p>\n<pre>var host=\"ws:\/\/localhost:8080\/first\/hello<span style=\"color: #ff0000;\">\/\/<\/span>\u3042\u3042\";\r\n-&gt;\r\nCaused by: java.lang.NumberFormatException: For input string: <span style=\"color: #ff0000;\">\"\"<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>\u6700\u5f8c\u306e\u6587\u5b57\u5217\u304c\u7a7a\u6587\u5b57\u3060\u3068\u7a7a\u6587\u5b57\u3068\u3057\u3066\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u308b\u3002<\/p>\n<pre>var host=\"ws:\/\/localhost:8080\/first\/hello\/12<span style=\"color: #ff0000;\">\/<\/span>\";\r\n-&gt;\r\n\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a75b4bc74-30e9-4a69-8af3-07ed67e6a296\r\n\u60c5\u5831: message[\u3042]\r\n\u60c5\u5831: hoge[12]\r\n\u60c5\u5831: fuga<span style=\"color: #ff0000;\">[]<\/span><\/pre>\n<p>\/{\u7a7a\u6587\u5b57}\/{\u6570\u5b57}\u306e\u9806\u3067\u3082\u52d5\u3044\u305f\u3002\uff08<span style=\"color: #0000ff;\">\/\/\u3068\u306a\u308b\u306e\u3067\u74b0\u5883\u6b21\u7b2c\u3067\u306f\u4e0d\u5177\u5408\u304c\u51fa\u308b\uff1f\uff1f<\/span>\uff09<\/p>\n<pre>@ServerEndpoint(\"\/hello\/{fuga}\/{hoge}\")\u3068\u6700\u521d\u3092\u6587\u5b57\u5217\u306b\u3059\u308b\r\n-&gt;\r\nvar host=\"ws:\/\/localhost:8080\/first\/hello<span style=\"color: #ff0000;\">\/\/<\/span>12\";\r\n-&gt;\r\n\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a028c5db1-a60f-4d82-970f-8933058b2bfb\r\n\u60c5\u5831: message[\u3042\u3042\u3042]\r\n\u60c5\u5831: hoge[12]\r\n\u60c5\u5831: <span style=\"color: #ff0000;\">fuga[]<\/span><\/pre>\n<p>{\u5909\u6570\u540d}\u3068@PathParam\u3067\u8aa4\u8a18\u3092\u3059\u308b\u3068\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u306a\u3044(null)\u3002<\/p>\n<pre>@ServerEndpoint(\"\/hello\/{<span style=\"color: #ff0000;\">fuga<\/span>}\/{hoge}\")\r\n-&gt;\r\npublic void onMessage(String message,\r\n  @PathParam(\"hoge\") Integer hoge,\r\n  @PathParam(\"<span style=\"color: #ff0000;\">fuga2<\/span>\") String fuga)\r\n-&gt;\r\n\u60c5\u5831: \u958b\u59cb\u3057\u307e\u3059\uff1a49d01de4-4a6b-4b81-8c71-d6d48d9f0600\r\n\u60c5\u5831: message[\u3042]\r\n\u60c5\u5831: hoge[12]\r\n\u60c5\u5831: fuga[<span style=\"color: #ff0000;\">null<\/span>]<\/pre>\n<p>&nbsp;<\/p>\n<p>URL\u30d1\u30e9\u30fc\u30f3\u306e\u9055\u3044\u306b\u3088\u3063\u3066\u306f\u547c\u3073\u51fa\u3055\u308c\u306a\u3044\u3002<\/p>\n<p>\u4e00\u3064\u524d\u306enull\u304c\u30d0\u30a4\u30f3\u30c9\u3055\u308c\u308b\u4e8b\u8c61\u306f\u30d0\u30a4\u30f3\u30c9\u5bfe\u8c61\u304c\u4e0d\u6574\u5408\u3067\u3082\u52d5\u3044\u3066\u3044\u305f\u3051\u3069\u3001\u305d\u3063\u3061\u304c\u4e2d\u9014\u534a\u7aef\u306b\u52d5\u3044\u3066\u3044\u308b\u3060\u3051\u3067\u3001\u547c\u3073\u51fa\u3055\u308c\u306a\u3044\u306e\u304c\u6b63\u3057\u3044\u306e\u304b\u306a\uff1f\uff1f<\/p>\n<pre>@ServerEndpoint(\"\/hello\/<span style=\"color: #000000;\">{hoge}<\/span>\")\u3000<span style=\"color: #ff0000;\">&lt;-fuga2\u306f\u306a\u3044<\/span>\r\n-&gt;\r\npublic void onMessage(String message,\r\n   @PathParam(\"hoge\") Integer hoge,]\r\n   @PathParam(<span style=\"color: #ff0000;\">\"fuga2\"<\/span>) String fuga) {\r\n\r\n-&gt;\r\n23:27:25.244[23ms][total 23ms] Status: <span style=\"color: #ff0000;\">404[Not Found]<\/span>\r\nGET http:\/\/localhost:8080\/first\/hello\/12\/<span style=\"color: #ff0000;\">nasi<\/span> Load Flags[LOAD_BYPASS_CACHE  LOAD_BACKGROUND  INHIBIT_CACHING  ] Content Size[-1] Mime Type[application\/x-unknown-content-type]\r\n   Request Headers:\r\n      Host[localhost:8080]\r\n      User-Agent[Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:22.0) Gecko\/20100101 Firefox\/22.0]\r\n      Accept[text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8]\r\n      Accept-Language[ja,en-us;q=0.7,en;q=0.3]\r\n      Accept-Encoding[gzip, deflate]\r\n      Sec-WebSocket-Version[13]\r\n      Origin[http:\/\/localhost:8080]\r\n      Sec-WebSocket-Key[gq8u2S2nXT2xpIagf7qPaQ==]\r\n      Cookie[JSESSIONID=e1e94c1a637e58c7ccaa61c6f17e]\r\n      Connection[keep-alive, Upgrade]\r\n      Pragma[no-cache]\r\n      Cache-Control[no-cache]\r\n      Upgrade[websocket]\r\n   Response Headers:\r\n      X-Powered-By[Servlet\/3.1 JSP\/2.3 (GlassFish Server Open Source Edition  4.0  Java\/Oracle Corporation\/1.7)]\r\n      Server[GlassFish Server Open Source Edition  4.0]\r\n      Set-Cookie[JSESSIONID=e2121d0c30e627004af713703b3d; Path=\/first; HttpOnly]<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u7d9a\u3051\u3066@PathParam\u3092\u8a66\u3057\u3066\u307f\u308b\u3002 API\u306b\u3088\u308b\u3068 ServerEndpoint\u306b{\u30d1\u30e9\u30e1\u30fc\u30bf}\u3067\u6307\u5b9a\u3057\u305f\u5024\u3068\u30d0\u30a4\u30f3\u30c9\u3057\u3066\u304f\u308c\u308b\u3089\u3057\u3044\u3002 \u5909\u6570\u3068\u3057\u3066\u4f7f\u3048\u308b\u578b\u306fString\u304b\u30d7\u30ea\u30df\u30c6\u30a3\u30d6Or\u305d\u306e\u30dc\u30af\u30b7\u30f3\u30b0\u578b\u3068\u306e\u3053\u3068\u3002 [&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":[8,9,70,7,6,16],"class_list":["post-113","post","type-post","status-publish","format-standard","hentry","category-javaee","tag-annotation","tag-glassfish","tag-javaee","tag-jsr-356","tag-websocket","tag-16"],"_links":{"self":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/113","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=113"}],"version-history":[{"count":5,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/113\/revisions"}],"predecessor-version":[{"id":124,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/113\/revisions\/124"}],"wp:attachment":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}