Java/JavaFX/通信

Top > Java > JavaFX > 通信

通信

JavaFXにもHTTP通信に特化したクラスが用意されてます。

Remote Text Document

プロトコルにHTTPを使用した,ドキュメントの取得にはjavafx.async.RemoteTextDocument?クラスを使用します。

   var doc: String;

   var remoteTextDocument = RemoteTextDocument {
       //URL
       url: "http://www.sorich.jp/"
       //メソッドタイプ
       method: "GET"
       //取得したドキュメント
       document: bind doc with inverse
       // ドキュメントを取得した後にコールされるコールバック関数
       onDone: function(result: Boolean) {
           println("onDone");
           //取得したドキュメントコンソールに表示
           println(doc);
       }
   }

   Stage {
       title : "RemoteTextDocument"
       scene: Scene {
           width: 200
           height: 200
           content: [  ]
       }
   }
  • RemoteTextDocument?クラス
    • 変数url
      URLを表します。
    • 変数method
      GETやPUTといったHTTPのメソッドを設定。何もセットしない時はデフォルトでGETが設定されます。
    • 変数document
      取得したドキュメントが保持されます。変数documentにdocを双方向バインドさせdocを使用してコンソールの取得した内容を表示しています。
  1. RemoteTextDocument?クラスはオブジェクトを生成すると非同期にドキュメントを取得しにいきます。ドキュメントの取得は非同期に行われるため,RemoteTextDocument?クラスのオブジェクト生成は処理がブロックすることはありません。
    ドキュメントの取得が完了すると,変数onDoneに代入された関数がコールされます。この時点で変数documentに取得した結果が代入されます。RemoteTextDocument?オブジェクトの動作が非同期で行われるため,そのままではすぐに実行が終了してしまうので,ダミーのStageオブジェクトを最後の実行しています。
  2. 現状では,RemoteTextDocument?クラスは文字セットを指定することができないので,文字化けを起こすことがありますその場合はHttpRequest?クラスを使用します。

Http Request

HttpRequest?クラスはHTTPの細かな制御を行うことが可能です。

  • HttpRequest?クラス
    • 変数location
      接続するurlを設定。
    • 変数method
      GETやPUTといったHTTPのメソッドを設定。HttpRequest?クラスではPUTやDELETEも扱うことができます。
    • 変数onXXX
      変数onXXXというが多く定義されています。X の部分にはConnectingやReadingなどHTTPの状態を表した言葉が入ります。これらの変数には,個々の状態の時にコールされるコールバック関数を設定することができます。
    var contentTtype: String;
   var httpRequest: HttpRequest;

   httpRequest = HttpRequest {
       //urlセット
       location: "ServerURL"
       //ヘッダーを読み込んだ後にコールされる
       onResponseHeaders: function(headerNames: String[]) {
           for (headerName in headerNames) {
               println(headerName);
               if (headerName == "content-type") {
                   //文字コードを取得
                   var char = httpRequest.getResponseHeaderValue(headerName);
                   var index = char.indexOf("=");
                   contentTtype = char.substring(index+1);
               }
           }
       }
       //ボディーを読み込むときコールされる
       onInput: function(stream: InputStream) {
           var reader: BufferedReader;    
           if (contentTtype != null) {
               // 文字セットを指定してストリームを生成
               reader = new BufferedReader(new InputStreamReader(stream, contentTtype));
           } else {
               //ストリーム生成
               reader = new BufferedReader(new InputStreamReader(stream));
           }
           while(true) {
               var text = reader.readLine();
               if (text == null) {
                   break;
               }
               println(text);
           }
           stream.close();
       }
   }
   // リクエスト開始
   httpRequest.enqueue();

   Stage {
       title: "HttpRequest"
       scene: Scene {
           width: 200
           height: 200
           content: [  ]
       }
   }
  1. 上記のコードでは,レスポンスのヘッダを読み込んだ後にコールされる関数を代入している変数onResponseHeaders?と,レスポンスのボディを読み込める状態になったときにコールされる関数を代入している変数onInputを設定しています。
    変数onResponseHeaders?では引数としてヘッダの名前の一覧が与えられます。もし,ここで文字セットを表すcontent-typeがあれば,ヘッダ名から値を取得するgetResponseHeaderValue?関数を使用して値を取得します。
    content-typeは"text/html; charset=UTF-8"のように表されるので,charset=の後の部分を取り出して,charset変数に代入しておきます。
  2. 次に変数onInputでボディの読み込みを行います。変数onInputでは引数としてInputStream?オブジェクトが与えられます。
    そこで,先ほど設定したcharsetを使用してリーダを生成させます。後は,生成したリーダを使用して読み込みを行います。
  3. なお,HttpRequest?クラスはオブジェクトを生成するだけでは,通信を行いませんのでenqueue関数をコールします。

アクセス総数3817件

最終更新日: 2009-09-03 (木) 22:36:54 (2822d)

このページをブックマーク:

このページのURL(コピペして利用下さい):

TOP