|
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
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サーバでのオペレーションの処理手順を以下に示します。
receiveRequest()
メソッドを呼び出してOBEXクライアントからのリクエストを待ちます。
receiveRequest()
は、OBEXクライアントからのリクエストを受信するまでブロックします。
getOperation()
メソッドを呼び出してOBEXクライアントから要求されたオペレーションの種別を取得します。
DISCONNECTオペレーションを受け取った場合は、OBEXクライアントが通信リンクの開放を通知したことを示します。
OBEXサーバも通信リンクを切断して通信を終了してください。
getContentLength()
メソッドを使用して取得することができます。
sendResponse()
メソッドを呼び出してOBEXクライアントにレスポンスを返します。
sendResponse()
の引数にはOBEXレスポンスコードを指定します。
OBEXレスポンスコードは ObexConnection
で定義されています。
定義されているOBEXレスポンスコードは、OBEX規格におけるレスポンスコードの規定に準拠しています。
各コードの意味などの詳細についてはOBEX規格を参照してください。
OBEXサーバがOBEXクライアントの要求を正常に処理できた場合、一般的にはOBEXサーバとして動作しているアプリケーションは、
OBEXレスポンスコードとして sendResponse()
に ObexConnection.SUCCESS
を返します。
OBEXサーバの処理は、全体として上記のシーケンスに合わせるようにしてください。 たとえばオペレーション処理の要求を受け付けていない状態でOBEXレスポンスヘッダを取得しようとすると例外が発生します。
以下にServerObexConnectionの状態遷移を示します。
図1. ServerObexConnectionの状態遷移
accept()
が呼び出されたときに自動的に行われます。
accept()
メソッドやreceiveRequest()
メソッドを呼び出してOBEXクライアントのアクションを待っている間に、
他のスレッドがServerObexConnectionオブジェクトのclose()メソッドを呼び出すとOBEX通信は中断されます。
この場合、Javaアプリケーションでは InterruptedIOException 例外が発生します。
また、タイムアウトやユーザーの中断操作などの要因によって通信が切断されることがあります。
メソッドの概要 | |
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 |
メソッドの詳細 |
public void accept() throws java.io.IOException
このメソッドは、接続が確立されるまでブロックします。 接続が確立された時点でこのメソッドから戻ります。
ConnectionException
- サポートしている数以上に接続を使おうとした場合に発生する(RESOURCE_BUSY
)ConnectionException
- ユーザー操作により通信が中断された場合に発生する(USER_ABORT
)InterruptedIOException
- 別スレッドからの中断要求やサスペンドにより通信が中断された場合に発生するjava.io.IOException
- I/Oエラーが発生した場合に発生するSecurityException
- OBEXの使用が許可されていない場合に発生する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エラーが発生した場合に発生するpublic int getOperation()
receiveRequest()
メソッドにおいて受信したリクエストのオペレーションコードを返します。java.lang.RuntimeException
- receiveRequestメソッドを呼び出す前に呼び出された場合に発生する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
- 別スレッドからの中断要求やサスペンドにより通信が中断された場合に発生する
|
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |