com.j_phone.io
インタフェース ClientObexConnection

すべてのスーパーインタフェース:
javax.microedition.io.Connection, javax.microedition.io.InputConnection, ObexConnection, javax.microedition.io.OutputConnection, javax.microedition.io.StreamConnection

public interface ClientObexConnection
extends ObexConnection

OBEXクライアントとして通信を行うためのフィールドやメソッドを定義したインタフェースです。

OBEXクライアントが使用するコネクションオブジェクトは ClientObexConnectionインタフェースを実装しています。 コネクションオブジェクトは、URL文字列"obex:/irclient"を指定してConnector.open()メソッドを呼び出すことにより取得します。

以下に OBEXクライアントとして通信を行う場合のコード例を示します。

 try {
     ClientObexConnection coc;

     // ClientObexConnectionインスタンスの取得
     coc = (ClientObexConnection)Connector.open("obex:/irclient",
                                                Connector.READ_WRITE);

     // OBEXサーバに接続
     coc.connect();

     // GETオペレーションの実行
     coc.setOperation(ObexConnection.GET);    // オペレーションを設定
     coc.setName("sample_data1");             // NAMEヘッダを設定
     coc.sendRequest();                       // オペレーションを送信

     // OBEXサーバから返却されたレスポンスコードをチェックし
     // 正常であれば受信したオブジェクトを読み込む
     int response = coc.getResponseCode();
     if (response == ObexConnection.SUCCESS) {
         InputStream in = coc.openInputStream();
         // 読み込み処理
         in.close();
     } else {
         throw new IOException();
     }

     // PUTオペレーションの実行
     coc.setOperation(ObexConnection.PUT);    // オペレーションを設定
     coc.setName("sample_data2");             // NAMEヘッダを設定
     coc.setType("text/plain");               // TYPEヘッダを設定
     coc.setTime(System.currentTimeMillis()); // TIMEヘッダを設定

     OutputStream out = coc.openOutputStream();
     // OBEXサーバへ送信するデータの書き込み処理
     out.close();

     coc.sendRequest();                       // オペレーションを送信

     //レスポンスコードが正常であれば処理を終了
     response = coc.getResponseCode();
     if (response != ObexConnection.SUCCESS) {
         throw new IOException();
     }
     coc.close();

 } catch (IOException e) {
     // 例外処理
 }
 

JavaアプリケーションはOBEXクライアントとして通信を行う際に、connect()メソッドを呼び出してOBEXサーバとの間に赤外線通信のリンクを確立します。 赤外線通信が確立されたリンク上では、複数のオペレーションを連続して処理することができます。 前出のサンプルコードでは、確立した通信リンク上でGETオペレーションとPUTオペレーションを1回ずつ処理し、 その後close()メソッドを呼び出して通信リンクを切断しています。

OBEXクライアントでのオペレーションの処理手順を以下に示します。

  1. setOperation()メソッドを呼び出してオペレーション種別を設定します。

  2. ObexConnectionインタフェースに定義されているメソッドを使用してOBEXリクエストヘッダを設定します。 メソッドを使用して設定することのできるOBEXリクエストヘッダには、Nameヘッダ、Typeヘッダ、Timeヘッダがあります。

  3. PUTオペレーションの場合、送信するオブジェクトボディの内容を書き込みます。 この操作は、コネクションオブジェクトの openOutputStream()、または openDataOutputStream()メソッドによって取り出した出力ストリームを使用して行います。

  4. sendRequest()メソッドを使用してオペレーションをOBEXサーバへ送信します。 sendRequest()は、OBEXサーバからのレスポンスをすべて受信するまでブロックします。 sendRequest()から処理が戻ると、OBEXサーバから返されたOBEXレスポンスコードや、OBEXレスポンスヘッダの内容を参照することができます。 OBEXクライアントが参照することのできるOBEXレスポンスヘッダには、Nameヘッダ、Typeヘッダ、Timeヘッダがあります。

    OBEXレスポンスコードは ObexConnection で定義されています。 定義されているOBEXレスポンスコードは、OBEX規格におけるレスポンスコードの規定に準拠しています。 各コードの意味などの詳細についてはOBEX規格を参照してください。

    OBEXサーバがOBEXクライアントの要求を正常に処理できた場合、一般的にはOBEXクライアントとして動作しているアプリケーションは、 OBEXレスポンスコードとして getResponseCode() から ObexConnection.SUCCESS を受け取ります。

  5. GETオペレーションの場合、返されたオブジェクトボディの内容を読み出します。 この操作は、コネクションオブジェクトの openInputStream()、またはopenDataInputStream()メソッドによって取り出した入力ストリームを使用して行います。 オブジェクトボディの長さは、getContentLength()メソッドを使用して取得することができます。

OBEXクライアントの処理は、全体として上記のシーケンスに合わせるようにしてください。 たとえばオペレーション処理の要求をOBEXサーバに送信していない状態でOBEXレスポンスヘッダを取得しようとすると例外が発生します。

以下にClientObexConnectionの状態遷移を示します。

ClientObexStatus.gif

図1. ClientObexConnectionの状態遷移

注意事項

導入されたバージョン:
JSCL 1.2

インタフェース com.j_phone.io.ObexConnection から継承したフィールド
ACCEPTED, BAD_GATEWAY, BAD_REQUEST, CONFLICT, CONTINUE, CREATED, DATABASE_FULL, DATABASE_LOCKED, DISCONNECT, FORBIDDEN, GATEWAY_TIMEOUT, GET, GONE, HTTP_VERSION_NOT_SUPPORTED, INTERNAL_SERVER_ERROR, LENGTH_REQUIRED, METHOD_NOT_ALLOWED, MOVED_PERMANENTLY, MOVED_TEMPORARILY, MULTIPLE_CHOICES, NO_CONTENT, NON_AUTHORITATIVE_INFORMATION, NOT_ACCEPTABLE, NOT_FOUND, NOT_IMPLEMENTED, NOT_MODIFIED, PARTIAL_CONTENT, PAYMENT_REQUIRED, PRECONDITION_FAILED, PROXY_AUTHENTICATION_REQUIRED, PUT, REQUEST_ENTITY_TOO_LARGE, REQUEST_TIME_OUT, REQUEST_URL_TOO_LARGE, RESET_CONTENT, SEE_OTHER, SERVICE_UNAVAILABLE, SUCCESS, UNAUTHORIZED, UNSUPPORTED_MEDIA_TYPE, USE_PROXY
 
メソッドの概要
 void connect()
          接続を確立します。
 int getResponseCode()
          レスポンスコードを取得します。
 void sendRequest()
          リクエストを送信してレスポンスを受信します。
 void setOperation(int operation)
          オペレーションコードを指定します。
 
インタフェース com.j_phone.io.ObexConnection から継承したメソッド
getContentLength, getName, getTime, getType, setName, setTime, setType
 
インタフェース javax.microedition.io.InputConnection から継承したメソッド
openDataInputStream, openInputStream
 
インタフェース javax.microedition.io.Connection から継承したメソッド
close
 
インタフェース javax.microedition.io.OutputConnection から継承したメソッド
openDataOutputStream, openOutputStream
 

メソッドの詳細

connect

public void connect()
             throws java.io.IOException
接続を確立します。
例外:
ConnectionException - サポートしている数以上の接続を使おうとした場合に発生する(RESOURCE_BUSY
ConnectionException - ネイティブの OBEX レイヤでタイムアウトが発生した場合に発生する(TIMEOUT
ConnectionException - ユーザー操作により通信が中断された場合に発生する。(USER_ABORT
InterruptedIOException - 別スレッドからの中断要求やサスペンドにより通信が中断された場合に発生する
java.io.IOException - I/Oエラーが発生した場合に発生する
SecurityException - OBEX の使用が許可されていない場合に発生する

setOperation

public void setOperation(int operation)
オペレーションコードを指定します。 設定できるオペレーションは "PUT" と "GET" です。
パラメータ:
operation - オペレーションコード
例外:
java.lang.IllegalArgumentException - 引数operationにサポートされていないオペレーションコードが指定された場合に発生する

sendRequest

public void sendRequest()
                 throws java.io.IOException
リクエストを送信してレスポンスを受信します。

このメソッドは、リクエストを送信してからレスポンスをすべて受信するまでブロックします。 レスポンスの受信がすべて終わった時点でこのメソッドから戻ります。

このメソッドを呼び出すと、それより前にこの接続オブジェクトから取り出した InputStream、DataInputStream、OutputStream、DataOutputStream が無効になります。 次に InputStream、DataInputStream を取り出した時は、このリクエストにより受信したデータを読み出す入力ストリームを返します。 また、次に OutputStream、DataOutputStream を取り出した時は、次のリクエストで送信するデータを書き込む出力ストリームを返します。

例外:
java.io.IOException - I/Oエラーが発生した場合に発生する
ConnectionException - オペレーションが設定されていない場合に発生する(ILLEGAL_STATE
ConnectionException - ネイティブの OBEX レイヤでタイムアウトが発生した場合に発生する(TIMEOUT
ConnectionException - ユーザー操作により通信が中断された場合に発生する(USER_ABORT
ConnectionException - レスポンスコードが 0x20 番台(generally ok 系のステータスコード) 以外だった場合に発生する(OBEX_ERROR
InterruptedIOException - 別スレッドからの中断要求やサスペンドにより通信が中断された場合に発生する

getResponseCode

public int getResponseCode()
レスポンスコードを取得します。 直前に実行したsendRequest()メソッドにおいて受信したレスポンスのレスポンスコードを返します。
戻り値:
レスポンスコード
例外:
java.lang.RuntimeException - sendRequest()メソッドを呼び出す前に呼び出された場合に発生する