Java HTML 5 WebSocket Avatar

27,938 views
28,108 views

Published on

This presentation explain the strategy for HTML 5 in Java EE 7.

Published in: Technology

Java HTML 5 WebSocket Avatar

  1. 1. Yoshio TeradaJava Evangelisthttp://yoshio3.com, Twitter : @yoshioterada1 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  2. 2. 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するもので す。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み 込むことはできません。以下の事項は、マテリアルやコード、機能を提供す ることをコミットメント(確約)するものではないため、購買決定を行う際 の判断材料になさらないで下さい。オラクル製品に関して記載されている機 能の開発、リリースおよび時期については、弊社の裁量により決定されます 。 Oracleは、米国オラクルコーポレーション及びその子会社、関連会社の米国及びその他の国における登録商 標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。2 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  3. 3. Make the Future Java(Java の未来を創造)3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  4. 4. Java EE 7 : 2013年 春頃 提供開始予定 テーマ:HTML5 と開発生産性の向上 Java EE 7 SDK の提供開始4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  5. 5. Java EE 7 へ含まれる予定の JSR 一覧 JAX-RS Java Caching JSP 2.2 JSF 2.2 EL 3.0 Portable 2.0 API (JSR-107) Extensions Servlet 3.1 Batch Bean Validation 1.1 Application (JSR-352) Common Interceptors 1.1 CDI 1.1 Annotations 1.1 Java API for JSON Managed Bean 1.0 EJB 3.2 (JSR-353) Java API for Connector WebSocket JPA 2.1 JTA 1.2 JMS 2.0 1.6 (JSR-356) 新規追加 大幅な更新 通常の更新5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  6. 6. Java EE 7 の注目技術6 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  7. 7. 今日ご紹介する内容 HTML5化に関するテーマ7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  8. 8. JSR 344 :JavaServer™ Faces 2.2 8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  9. 9. JSF 2.2新機能の一覧 HTML5 マークアップ・サポート – Pass through attributes and elements Faces フロー CSRF (クロス・サイト・リクエスト・フォージェリ) 対策 ResourceHandler 経由で Facelets のロード ファイル・アップロード マルチ・テンプレート9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  10. 10. JSF : コンポーネント・ベース開発10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  11. 11. JSFフレームワークと開発の概要 Web コンテナ Web アプリケーションクライアント プレゼン • アプリケーションロジック ビジネスロジック テーション • コンバート (変換) • バリデーション (検証) • ナビゲーション (画面遷移) • イベント処理 DB JavaServer Faces Web サービス 11 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  12. 12. (jsf:value=“”, jsf:action=“”) 今までの開発スタイル JSF 2.0 の開発スタイル コード変換 (XHTML) が必要 デザイナー プログラマー デザイナー プログラマー (HTML) (JSP) 同一ファイルを参照編集可能 デザイナーはテキスト&ブラウザで確認  デザイナーはテキスト&ブラウザで確認 プログラマーはJSP&Webコンテナで確認  プログラマーはXHTMLに要素を挿入 プログラム後のデザイン修正は困難  同一ファイルの為デザイン修正も容易 12 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  13. 13. HTML 5 マークアップ・サポート JSF 2.2 からは 素の HTML コードに JSF 属性を埋め込みましょう!!13 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  14. 14. HTML 5 マークアップ・サポート JSF のライフサイクルに適用可14 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  15. 15. HTML 5 マークアップ・サポート HTML 5 の表現力をそのままに!!15 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  16. 16. HTML 5 マークアップ・サポート<input type=“color” jsf:value=“#{colorBean.color2}”/><input type=“date” jsf:value=“#{calendarBean.date1}” /><keygen jsf:id jsf:value="#{bean.pubKey}"/>標準の HTML 5 タグに jsf:value , jsf:action 等の要素を追加<jsf:element p:elementName="keygen" id=”myKey"p:name="myKey" value="#{bean.myKey}"/>直接要素を JSF ランタイムにスルーも可能 16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  17. 17. ファイル・アップロード<h:form prependId="false" enctype="multipart/form-data"> <h:inputFile id="fileUpload" value="#{test.upfile}"/> <h:commandButton value="upload" action="#{test.doUpload}"/></h:form>将来的には Ajax 対応(Java EE 7 の正式リリース時)のファイルアップロード機能も提供予定ご参考 : http://yoshio3.com/2012/10/20/jsf22-env-on-gf3122/ 17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  18. 18. ファイル・アップロード@Named(value = "test")@RequestScopedpublic class TestManagedBean { private javax.servlet.http.Part upfile; public String doUpload() { try { String fileName = getFilename(upfile); upfile.write(fileName); } catch (IOException ex) { ex.printStackTrace(); } return ""; } 18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  19. 19. マルチ・テンプレート 同一コンテンツに対しテンプレートでデザイン切り替え可能ご参考 : http://jsfmtsystem.appspot.com/ 19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  20. 20. マルチ・テンプレート同一コンテンツに対しテンプレートでデザイン切り替え可能 <ui:composition template="#{template}">JSF タグ </ui:composition> デフォルトのスキニング ファイル サムネイル facelets のテンプレート メタ・データ テンプレートのディレクトリ構造20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  21. 21. マルチ・テンプレート 同一コンテンツに対しテンプレートでデザイン切り替え可能 <template> <name>mytemplate</name> <version>1.1</version>コピーライト・契約等が可能 <creationDate>11.22.2012</creationDate> <author>Yoshio Terada</author> <authorEmail>Yoshio.Terada@foo.jp</authorEmail>複数テンプレートの利用が可能 <authorUrl>http://yoshio.com</authorUrl> <copyright>Yoshio Terada</copyright>jar ファイルにパッケージ化 <license>GNU/GPL version 2</license> <description>Yoshio’s Original Template</description> </template> メタ・データの内容ご参考: http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-971 21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  22. 22. JSR 356:JavaTM API for WebSocket22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  23. 23. 飛行機の事前座席指定23 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  24. 24. オークション24 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  25. 25. 最新情報・更新情報を 取得するために 今どうしていますか?25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  26. 26. オークション・サイトで更新情報を取得する場合 接続 価格(空席)の 最新情報をくださ 価格(空席) い 情報をくださ い データベース サービス26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  27. 27. オークション・サイトで更新情報を取得する場合 <HTML> ヘッダー ボタン1の画像 ボタン2の画像 A の価格 余分な広告 2000円 データベース 他へのリンク サービス 製品情報:製品A 製品価格:2000円 製品詳細:これは フッダー </HTML> 切断27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  28. 28. 再度・更新情報を取得する場合 接続 価格の 最新情報をくださ 価格情報を い ください データベース サービス28 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  29. 29. 再度・更新情報を取得する場合 <HTML> ヘッダー ボタン1の画像 ボタン2の画像 A の価格 余分な広告 4000円 データベース 他へのリンク サービス 製品情報:製品A 製品価格:4000円 製品詳細:これは フッダー </HTML> 切断29 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  30. 30. 1人あたり3回のアクセスで多数の接続・切断接続切断 ….. 製品価格:4000接続 円 …..切断接続 ….. 製品価格:4000切断 円 データベース ….. サービス接続切断 ….. 製品価格:4000接続 円切断 …..接続 …..切断 製品価格:4000 円30 Copyright © 2012, Oracle and/or its affiliates. All rights reserved. …..
  31. 31. システム全体に高負荷31 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  32. 32. 本当に必要な情報は? <HTML> ヘッダー ボタン1の画像 ボタン2の画像 余分な広告 他へのリンク 製品情報:製品A 4000 円 製品価格:4000円 製品詳細:これは… フッダー これだけ </HTML>32 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  33. 33. ネットワーク帯域も無駄33 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  34. 34. WebSocket の背景 – Server Push Polling Long Polling 複雑・非効率・無駄Comet/Ajax34 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  35. 35. WebSocket を使えばどうなる? 接続 接続 2000円 3000円 3000円 データベース サービス 4000円 5000円 6000円 監視プログラムは 6000円 1つのみ 切断35 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  36. 36. 1人辺り接続・切断処理は1度接続切断 受信 送信 受信接続切断 送信 データベース 受信 サービス 受信接続切断 受信 受信 送信 監視プログラムは接続 受信 送信 1つのみ切断 受信36 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  37. 37. 接続・切断数の減少 不要なデータ配信の排除が可能37 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  38. 38. WebSocket とは TCP ベース 双方向・全二重通信 RFC 6455 JavaScript API by W3C38 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  39. 39. ブラウザの対応状況http://caniuse.com/websockets現バージョンの対応状況39 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  40. 40. WebSocket の基本概念 コネクションの確立双方向のメッセージ送信 コネクションの切断40 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  41. 41. コネクションの確立 HandShake リクエスト HandShake レスポンスクライアント サーバ41 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  42. 42. HandShake リクエスト (RFC 6455で定義) GET /mychat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: megachat, chat Sec-WebSocket-Extensions : compress, mux Sec-WebSocket-Version: 13 Origin: http://example.comクライアント サーバ42 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  43. 43. HandShake レスポンス (RFC 6455で定義) HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat Sec-WebSocket-Extensions: compress, muxクライアント サーバ43 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  44. 44. コネクションの確立クライアント サーバ44 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  45. 45. WebSocket のライフサイクル 接続確立 Open Open Message Message Message Message Message Message Error Close 接続切断クライアント サーバ45 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  46. 46. WebSocket APIwww.w3.org/TR/websockets/46 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  47. 47. Java API for WebSocket (JSR-356)仕様 http://jcp.org/en/jsr/detail?id=356 http://java.net/projects/websocket-spec ステータス: Early Draft47 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  48. 48. 参照実装http://java.net/projects/tyrus最新の GlassFish v4開発ビルドにバンドル済48 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  49. 49. Java のWebSocket 標準実装はとてもかんたん49 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  50. 50. WebSocket アノテーション アノテーション レベル 内容@WebSocketEndpoint クラス WebSocket のエンドポイントを示す@WebSocketOpen メソッド 接続確立時に呼び出すメソッドを指定@WebSocketClose メソッド 接続切断時に呼び出すメソッドを指定@WebSocketMessage メソッド メッセージを受信した時に呼び出すメソッドを 指定@WebSocketPathParam メソッド エンドポイントのURI 引数に指定されたパラ パラメータ メータを取得する際に仕様@WebSocketError メソッド エラー発生時に呼び出すメソッドを指定 50 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  51. 51. WebSocket アプリケーション・ライフサイクルvar wsUri = "ws://HOST/foo/hello"; @WebSocketEndpoint("/hello")var websocket = new WebSocket(wsUri);websocket.onopen = function(evt) @WebSocketOpen{ onOpen(evt) };websocket.onmessage = function(evt) @WebSocketMessage{ onMessage(evt) };websocket.onerror = function(evt) @WebSocketError{ onError(evt) };websocket.onclose = function(evt) @WebSocketClose{ onClose (evt) }; JavaScript WebSocket API 51 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  52. 52. HelloWorld アプリケーション (1対1)import javax.net.websocket.annotations.*;@WebSocketEndpoint("/hello")public class HelloBean { @WebSocketMessage public void sayHello(Session session, String msg) { session.getRemote().sendString(“Hello” + msg); }} 52 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  53. 53. デモ53 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  54. 54. サンプル・アプリケーションの構成 (多対1) RE Session Twitter4J Session RE 監視 Session Twitter RE WebSocket Endpoint Remote Endpoint54 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  55. 55. Twitter Streaming アプリ@WebSocketEndpoint(value= "/twitter")public class TwitterWebSocket { @WebSocketOpen public void initOpen(Session session) { TwitterClientSingleton.peers.add(session); } @WebSocketClose public void closeWebSocket(Session session){ TwitterClientSingleton.peers.remove(session); }} 55 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  56. 56. Twitter Streaming アプリ@Startup @Singletonpublic class TwitterClientSingleton extends StatusAdapter {public static Set<Session> peers = null; static { peers = Collections.synchronizedSet(new HashSet());}...続く クライアントの参照情報を保持 Session Session Session Session ・・・・・・ RE RE RE RE 56 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  57. 57. データ送信コード (ブロッキング) シーケンシャルに配信を実施 (大量のデータで待ち)public void onStatus(Status status) { User user = status.getUser(); String resStr = "@" +user.getScreenName() + " : " + status.getText() ; try { 全ピア(RE)に対して配信 for (Session peer : peers) { peer.getRemote().sendString(resStr); } } catch (IOException ioe) { ioe.printStackTrace(); Session Session Session Session } } RE RE RE RE 57 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  58. 58. データ送信コード (ノン・ブロッキングfor (Session peer : peers) { Future<SendResult> futureSend = peer.getRemote().sendStringByFuture(resStr); while (!futureSend.isDone()) { // wait here ? } SendResult status = futureSendResult.get(); if (status.isOK()) { // ok } else { // whoops, send failed. }} 58 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  59. 59. こんな場合は Java EE で WebSocket を!!59 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  60. 60. OracleResearch Project !!60 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  61. 61. Project Avatar61 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  62. 62. Project Avatar とはコンセプト 先進的な HTML 5 アプリ構築フレームワーク – WebSocket, Server-Sent Event, RESTful に対応 モジュール化対応 JavaScript フレームワーク 軽量なサーバ・アーキテクチャ (Thin-Server Architecture) Avatar のメリット – サーバ・サイドJavaScript と Java EE アプリの融合 – Java VM 上で稼働する JavaScrip のスケーラビリテイ・信頼性・運用保守性62 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  63. 63. Thin-Server アーキテクチャ (TSA) View HTTP/JS今まで アプリ Model サーバ側でマージ アプリ View View HTTP/JSTSA クライアント側 Model Service JSON でマージ63 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  64. 64. Avatar の概念 (クライアント側) Avatar View (UI Node) (Controller) Model Webコンポーネント • データ・ アクセス方法を提供 と同様 バインディング • ローカル <a:page> • ナビゲーション • RESTful <a:form> • ローカル・ • SSE <a:input> ストレージ • WebSocket <a:textarea> … ブラウザ(JavaScript/DOM)64 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  65. 65. Avatar の概念 (サーバ側) Service Avatar Data プロバイダ アクセス方法を提供 ルーティング 利用可能なデータソー • RESTful JSON のシリアライ ス • ファイル • SSE ズ • DB(JPA) • WebSocket • インメモリ Coherence Nashorn (JavaVMで稼働するJavaScriptエンジン)65 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  66. 66. Avatar のアーキテクチャ Avatar アプリ View Avatar アプリ (HTML 5/JS/CSS) HTTP サービス (XML/JavaScript) Avatar 実行環境 Data HTTP/ サービス Avatar コンパイラ WebSocket Nashorn (JavaScript エンジン) UI HTML 5 DOM Java EE Java EE アプリ ローカルストレージ HTTP/ サービスブラウザ WebSocket App サーバ66 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  67. 67. Avatar のアーキテクチャ Avatar アプリ View Avatar アプリ (HTML 5/JS/CSS) HTTP サービス (XML/JavaScript) Avatar 実行環境 Data HTTP/ ①サービスアプリの作成 Avatar Avatar コンパイラ WebSocket Nashorn (JavaScript エンジン) UI HTML 5 DOM Java EE Java EE アプリ ローカルストレージ HTTP/ サービスブラウザ WebSocket App サーバ67 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  68. 68. Avatar のアーキテクチャ Avatar アプリ View Avatar アプリ (HTML 5/JS/CSS) HTTP サービス (XML/JavaScript) Avatar 実行環境 Data HTTP/ サービス Avatar コンパイラ WebSocket ② Avatar コンパイラで Nashorn (JavaScript エンジン) UI HTML 5 DOM View サービス Java EE サービス Data を生成 Java EE アプリ ローカルストレージ HTTP/ サービスブラウザ WebSocket App サーバ68 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  69. 69. Avatar のアーキテクチャ Avatar アプリ View Avatar アプリ (HTML 5/JS/CSS) HTTP サービス (XML/JavaScript) Avatar 実行環境 Data HTTP/ サービス Avatar コンパイラ③ View サービスの WebSocket Nashorn (JavaScript エンジン) UI HTML 5 DOM 「複数ページの一括」 ダウンロード Java EE (※プラグインは不要) HTTP/ サービス Java EE アプリ ローカルストレージブラウザ WebSocket App サーバ69 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  70. 70. Avatar のアーキテクチャ Avatar アプリ View Avatar アプリ (HTML 5/JS/CSS) HTTP サービス (XML/JavaScript) Avatar 実行環境 Data HTTP/ サービス Avatar コンパイラ WebSocket Nashorn (JavaScript エンジン) UI HTML 5 DOM④ WebSocket/Server-Sent Event/ Java EE RESTful で Data サービスを利用 ローカルストレー Java EE アプリ HTTP/ サービスブラウザ ジ WebSocket App サーバ70 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  71. 71. Avatar のアーキテクチャ Avatar アプリ View Avatar アプリ (HTML 5/JS/CSS) HTTP サービス (XML/JavaScript) Avatar 実行環境 Data HTTP/ サービス Avatar コンパイラ ⑤ サーバ側はJava EE WebSocket Nashorn (JavaScript エンジン) UI HTML 5 DOM のサービスも利用可能 Java EE ローカルストレー Java EE アプリ HTTP/ サービスブラウザ ジ WebSocket App サーバ71 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  72. 72. Avatar のアーキテクチャ Avatar アプリ View Avatar アプリ (HTML 5/JS/CSS) HTTP サービス (XML/JavaScript) Avatar 実行環境 Data HTTP/ サービス Avatar コンパイラ WebSocket Nashorn (JavaScript エンジン) UI HTML 5 DOM ⑥ クライアント側は HTML 5, DOM, Java EE ローカルストレー ローカルストレージ Java EE アプリ HTTP/ サービスブラウザ ジ 等を利用可能 WebSocket App サーバ72 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  73. 73. クライアントで動作するアプリ アプリ View(Hello World) Model<a:viewModule …> <a:page><a:localModel> <a:model id="name" var NameModel = function(){ idref="NameModel"/> this.first = "Planet"; <a:form> this.last = "Earth"; <a:input label="First Name" this.clear = function(){ value="#{name.first}"/> this.first = this.last = <a:input label="Last Name" ""; value="#{name.last}"/> }; <a:output value="Hello }; #{name.first} #{name.last}"/><a:/localModel> <a:button label="Clear" action="#{name.clear()}"/> ローカルのモデルを定義 <a:/form><a:/page><a:/viewModule> 73 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  74. 74. WebSocketで動作するアプリ(Model の実装例) Model JSON Service<a:socketModel> Model 用に用意されているvar ChatModel = function(){ this.message = ""; プロトタイプ関数を上書き実装 this.user = ""; var superSend = this.$send; • this.$onMessage this.$send = function(){ • this.$send this.process(this.message); • etc. superSend.call(this); }; …. };<a:/socketModel> 74 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  75. 75. WebSocketで動作するアプリ(Service の実装例) Model JSON Service<a:socketService Service 用に用意されている url="websocket/chat"> var SocketService = function(){ プロトタイプ関数を上書き実装 this.$onMessage = function(peer,message){ • this.$onMessage this.process(message); • this.$onTimeOut peer.getContext().sendAll(message); • etc. };};<a:/socketService> 75 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  76. 76. New Announcement 2013 年 春頃 Java イベント開催予定76 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  77. 77. 77 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
  78. 78. 78 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.

×