{"id":253,"date":"2013-08-02T13:21:51","date_gmt":"2013-08-02T04:21:51","guid":{"rendered":"http:\/\/www.rocher.kyoto.jp\/araburu\/?p=253"},"modified":"2013-08-02T13:23:07","modified_gmt":"2013-08-02T04:23:07","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%ae5","status":"publish","type":"post","link":"https:\/\/www.rocher.kyoto.jp\/arbr\/?p=253","title":{"rendered":"JavaFX\u3068Websocket\u3092\u9023\u643a\u3057\u3066\u307f\u308b(On Glassfish4.0) \u305d\u306e\uff14"},"content":{"rendered":"<p>WebSocket\u3067\u53d7\u3051\u53d6\u3063\u305f\u30c7\u30fc\u30bf\u3092JavaFX\u306e\u30e9\u30d9\u30eb\u306b\u8a2d\u5b9a\u3059\u308b\u65b9\u6cd5\u3068\u308a\u3042\u3048\u305a\u52d5\u3044\u305f\u3002<\/p>\n<p>\u5927\u307e\u304b\u306a\u30d5\u30ed\u30fc\u306f\u3001<\/p>\n<ol>\n<li>WebSocket\u8d77\u52d5<\/li>\n<li>Websocket\u306e@OnMessage\u3067\u30c7\u30fc\u30bf\u53d7\u4fe1<\/li>\n<li>@OnMessage\u306e\u4e2d\u3067Platform.runLater\u3092\u4f7f\u3063\u3066JavaFX\u306e\u30b9\u30ec\u30c3\u30c9\u3092\u8d77\u52d5\uff08\u30b3\u30de\u30f3\u30c9\u306e\u4f9d\u983c\uff1f\uff1f\uff09<\/li>\n<li>Platform.runLater\u306e\u4e2d\u3067Label#setText\u3092\u547c\u3073\u51fa\u3057\u3066\u5024\u3092\u66f4\u65b0<\/li>\n<\/ol>\n<p>\uff08\u30dc\u30bf\u30f3\u30a4\u30d9\u30f3\u30c8\u304b\u3089Websocket\u306e\u8d77\u52d5\u5468\u308a\uff09<\/p>\n<pre>public class SampleController {\r\n\r\n\u00a0\u00a0 \u00a0@FXML\r\n\u00a0\u00a0 \u00a0private Label testLabel;\r\n\r\n\u00a0\u00a0 \u00a0@FXML\r\n\u00a0\u00a0 \u00a0private void handleButtonAction(ActionEvent event) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0kickWebSocket();\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0private void kickWebSocket() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0try {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CountDownLatch messageLatch = new CountDownLatch(1);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0URI clientURI = new URI(\"ws:\/\/localhost:8080\/first\/hello\/\");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ClientManager cliContainer = org.glassfish.tyrus.client.ClientManager\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0.createClient();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0cliContainer.connectToServer(new WSClient(testLabel), clientURI);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0messageLatch.await(1, TimeUnit.SECONDS);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0} catch (DeploymentException | URISyntaxException\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0| InterruptedException ex) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Logger.getLogger(SampleController.class.getName()).log(\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Level.SEVERE, null, ex);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<p>\uff08OnMeessage\u304b\u3089\u5024\u306e\u8a2d\u5b9a\uff09<\/p>\n<pre>@ClientEndpoint\r\npublic class WSClient {\r\n\r\n\u00a0\u00a0 \u00a0private Label testLabel;\r\n\r\n\u00a0\u00a0 \u00a0public WSClient(Label testLabel) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0this.testLabel = testLabel;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@OnOpen\r\n\u00a0\u00a0 \u00a0public void onOpen(Session session) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"Connection had opened.\");\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@OnMessage\r\n\u00a0\u00a0 \u00a0public void onMessage(String message) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (message.length() == 0) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0final String channeled = message;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0<span style=\"color: #ff0000;\">Platform.runLater(new Runnable() {<\/span>\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0@Override\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0public void run() {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0<span style=\"color: #ff0000;\">testLabel.setText(channeled);<\/span>\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0};\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0});\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@OnClose\r\n\u00a0\u00a0 \u00a0public void closeConnection(Session session) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"Connection had closed.\");\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@OnError\r\n\u00a0\u00a0 \u00a0public void error(Session sess, Throwable t) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"\u30a8\u30e9\u30fc\u3067\u3059\uff1a\" + sess.getId());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0t.printStackTrace();\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<p>\uff08\u4e00\u5fdc\u30b5\u30fc\u30d0\u5074\uff09<\/p>\n<pre>@ServerEndpoint(\"\/hello\/\")\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 <span style=\"color: #ff0000;\">\u00a0@OnMessage<\/span>\r\n\u00a0\u00a0 \u00a0public void onMessage(String message) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"message[\" + message + \"]\");\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (Session s : sessions) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0<span style=\"color: #ff0000;\">s.getAsyncRemote().sendText(message);<\/span>\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\u00a0\u00a0 \u00a0sessions.add(sess);\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\u00a0\u00a0 \u00a0sessions.remove(sess);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0@OnError\r\n\u00a0\u00a0 \u00a0public void error(Session sess,Throwable t) {\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0System.out.println(\"\u30a8\u30e9\u30fc\u3067\u3059\uff1a\" + sess.getId());\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0t.printStackTrace();\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<p>\u307e\u3060\u3001\u78ba\u8a8d\u3067\u304d\u3066\u3044\u306a\u3044\u306e\u304c\u3053\u306e\u5b9f\u88c5\u3067\u9806\u5e8f\u306e\u4fdd\u969c\u3067\u304d\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3002<\/p>\n<p>\uff08\u5b9f\u88c5\u7684\u306b\u306fWebSocket\u30dc\u30bf\u30f3\u62bc\u3057\u305f\u56de\u6570\u7acb\u3061\u4e0a\u304c\u3063\u305f\u308a\u3068\u9069\u5f53\u306a\u90e8\u5206\u306f\u3042\u308a\u307e\u3059\u304c\u3002\uff09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>WebSocket\u3067\u53d7\u3051\u53d6\u3063\u305f\u30c7\u30fc\u30bf\u3092JavaFX\u306e\u30e9\u30d9\u30eb\u306b\u8a2d\u5b9a\u3059\u308b\u65b9\u6cd5\u3068\u308a\u3042\u3048\u305a\u52d5\u3044\u305f\u3002 \u5927\u307e\u304b\u306a\u30d5\u30ed\u30fc\u306f\u3001 WebSocket\u8d77\u52d5 Websocket\u306e@OnMessage\u3067\u30c7\u30fc\u30bf\u53d7\u4fe1 @OnMessage\u306e\u4e2d\u3067Pl [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[71,6],"class_list":["post-253","post","type-post","status-publish","format-standard","hentry","category-javafx","tag-javafx","tag-websocket"],"_links":{"self":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/253","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=253"}],"version-history":[{"count":2,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/253\/revisions"}],"predecessor-version":[{"id":255,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=\/wp\/v2\/posts\/253\/revisions\/255"}],"wp:attachment":[{"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rocher.kyoto.jp\/arbr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}