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

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

public interface ServerObexConnection
extends ObexConnection

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

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

以下に ServerObexConnectionインタフェースの実装オブジェクトを使用する場合のコード例を示します。

 try {
     ServerObexConnection soc;

     // ServerObexConnectionインスタンスの取得
     soc = (ServerObexConnection)Connector.open("obex:/irserver",
                                                Connector.READ_WRITE);

     // OBEXクライアントからの通信リンク確立要求を待ち合わせる
     soc.accept();

     // OBEXクライアントからのオペレーションを処理する
     while (true) {
         soc.receiveRequest();                // リクエストを受信
         int operation = soc.getOperation();  // オペレーションの種別を取得

         // GETオペレーション
         if (operation == ObexConnection.GET) {
             // OBEXクライアントからの要求を取得して
             // 対するオブジェクトを書き込む
             String name = soc.getName();     // NAMEヘッダを取得
             soc.setType("text/plain");       // 指定されたオブジェクトのヘッダ情報を設定
             soc.setTime(System.currentTimeMillis());

             OutputStream out = soc.openOutputStream();
             // OBEXクライアントへ送信するオブジェクトボディの書き込み処理
             out.close();

             // 正常終了のレスポンスコードをOBEXクライアントに返す
             soc.sendResponse(ObexConnection.SUCCESS);

         // PUTオペレーション
         } else if (operation == ObexConnection.PUT) {
             // OBEXクライアントから送信されたオブジェクトの情報を取得
             String name = soc.getName();
             String type = soc.getType();
             long time = soc.getTime();

             InputStream in = soc.openInputStream();
             // OBEXクライアントから送信されたオブジェクトの読み出し処理
             in.close();

             // 正常終了のレスポンスコードをOBEXクライアントに返す
             soc.sendResponse(ObexConnection.SUCCESS);

         // DISCONNECTオペレーション
         } else if (operation == ObexConnection.DISCONNECT) {
             break;
         }
     }
     // 通信リンクを切断する
     soc.close();
 } catch (IOException e) {
     // 例外処理
 }
 

JavaアプリケーションはOBEXサーバとして通信を行う際に、まずaccept()メソッドを呼び出して OBEXクライアントからの赤外線通信のリンク確立要求(OBEXクライアントのconnect()メソッド実行)を待ちます。 赤外線通信が確立されたリンク上では、複数のオペレーションを連続して処理することができます。 前出のサンプルコードでは、1回確立した通信リンク上で、OBEXクライアントからの切断要求を受けつけるまで繰り返しオペレーションの処理を行っています。 OBEXクライアントからDISCONNECTオペレーションにより通信リンクの開放が通知された場合、close()メソッドを呼び出して通信リンクを切断します。

OBEXサーバでのオペレーションの処理手順を以下に示します。

  1. receiveRequest()メソッドを呼び出してOBEXクライアントからのリクエストを待ちます。 receiveRequest()は、OBEXクライアントからのリクエストを受信するまでブロックします。

  2. getOperation()メソッドを呼び出してOBEXクライアントから要求されたオペレーションの種別を取得します。 DISCONNECTオペレーションを受け取った場合は、OBEXクライアントが通信リンクの開放を通知したことを示します。 OBEXサーバも通信リンクを切断して通信を終了してください。

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

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

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

  6. OBEXクライアントからの要求がGETオペレーションだった場合、OBEXクライアントが要求しているオブジェクトのオブジェクトボディを書き込みます。 この操作は、openOutputStream()、またはopenDataOutputStream()メソッドによって取り出した出力ストリームを使用して行います。

  7. sendResponse()メソッドを呼び出してOBEXクライアントにレスポンスを返します。 sendResponse()の引数にはOBEXレスポンスコードを指定します。

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

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

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

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

ServerObexStatus.gif

図1. ServerObexConnectionの状態遷移

注意事項

導入されたバージョン:
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 accept()
          接続要求を待ちます。
 int getOperation()
          リクエストのオペレーションを取得します。
 void receiveRequest()
          リクエストの受信が完了するのを待ちます。
 void sendResponse(int code)
          レスポンスを送信します。
 
インタフェース 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
 

メソッドの詳細

accept

public void accept()
            throws java.io.IOException
接続要求を待ちます。

このメソッドは、接続が確立されるまでブロックします。 接続が確立された時点でこのメソッドから戻ります。

例外:
ConnectionException - サポートしている数以上に接続を使おうとした場合に発生する(RESOURCE_BUSY
ConnectionException - ユーザー操作により通信が中断された場合に発生する(USER_ABORT
InterruptedIOException - 別スレッドからの中断要求やサスペンドにより通信が中断された場合に発生する
java.io.IOException - I/Oエラーが発生した場合に発生する
SecurityException - OBEXの使用が許可されていない場合に発生する

receiveRequest

public void receiveRequest()
                    throws java.io.IOException
リクエストの受信が完了するのを待ちます。

このメソッドは、リクエストをすべて受信するまでブロックします。 リクエストをすべて受信した時点でこのメソッドから戻ります。 このメソッドから正常に戻った場合は、sendResponse()メソッドを呼び出して レスポンスを送信する必要があります。

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

例外:
ConnectionException - ユーザー操作により通信が中断された場合に発生する(USER_ABORT
InterruptedIOException - 別スレッドからの中断要求やサスペンドにより通信が中断された場合に発生する
java.io.IOException - I/Oエラーが発生した場合に発生する

getOperation

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

sendResponse

public void sendResponse(int code)
                  throws java.io.IOException
レスポンスを送信します。
パラメータ:
code - レスポンスコード
例外:
java.lang.IllegalArgumentException - 引数 code にサポートしていないレスポンスコードが指定された場合に発生する
java.io.IOException - I/Oエラーが発生した場合に発生する
ConnectionException - receiveRequestメソッドを呼び出す前に呼び出された場合に発生する(ILLEGAL_STATE
ConnectionException - ユーザー操作により通信が中断された場合に発生する(USER_ABORT
InterruptedIOException - 別スレッドからの中断要求やサスペンドにより通信が中断された場合に発生する