com.docomostar.io
インタフェース SocketConnection

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

public interface SocketConnection
extends javax.microedition.io.StreamConnection

TCP プロトコルでのネットワークへの接続を定義します。この機能は、パーミッションとして TCP 通信(クライアント/サーバー型もしくはPeer-to-Peer型)が許可されたトラステッドStarアプリでのみ利用することができます。

TCP 通信では、端末に対してドコモ網から接続に必要な情報(IPアドレス、ポート番号等)を取得した後、TCP セッションを確立して通信を行います。

[Star-1.3 まで] Star アプリがサスペンドすると必ず通信が切断されます。
[Star-1.5 以降] Star アプリがサスペンドしても通信が継続されます。 ただし、競合条件によっては、サスペンド時に通信が切断される場合もあります。

端末⇔コンテンツプロバイダ間で通信する「クライアント/サーバ型接続」、あるいは端末⇔端末間で通信する「Peer-to-Peer型接続」のいずれかの方式で通信を行うことができます。詳細は後述を参照してください。

本インタフェースには、以下の状態が存在します。

初期状態
Connector.open() を "socket" のスキームでコールすることで生成された直後の状態を指します。
ポートオープン状態
端末に対してドコモ網から接続に必要な情報(IPアドレス、ポート番号等)を取得した状態を指します。
初期状態で openRemotePort() メソッドを実行するとポートオープン状態に遷移します。
初期状態からのみ openRemotePort() メソッドは実行可能です。
TCP 通信可能状態
TCP 通信用のセッションが確立された状態を指します。
StreamConnection インタフェースから継承したストリームを利用する機能によりTCP通信を行うことができます。
ポートオープン状態で、 TCP のセッションが確立されると TCP 通信可能状態に遷移します。
セッション確立メソッド(connect()connect(String, int))は、ポートオープン状態からのみ実行可能です。
TCP 通信可能状態において網から切断された場合は、close()、getAddress()、getLocalAddress()、getLocalPort()、getPort() をのぞくメソッドの呼び出しはIOExceptionが発生します。
この場合はTCP通信不可状態への状態遷移のみが可能となります。
接続待ち状態
他の端末からの接続を待ち受けている状態を指します。
ポートオープン状態において、 listen(String, int) メソッドを実行すると接続待ち状態になります。
listen(String, int) メソッドはセッションが確立されるまで処理をブロックします。
listen(String, int) メソッドはポートオープン状態からのみ実行可能です。
TCP通信不可状態
TCP のポートがクローズされ、通信ができない状態を指します。
この状態では、ネットワークのリソース、及び送受信バッファ等のリソースは全て破棄されます。
close() メソッドを実行すると TCP 通信不可状態に遷移します。
close() メソッドは、任意の状態で実行することが可能です。

TCP 通信は「クライアント/サーバ型接続」、もしくは「Peer-to-Peer型接続」のいずれかの方式で通信を行うことができます。 以下にそれぞれの方式についての詳細を述べます。

クライアント/サーバ型接続
端末と任意のサーバの通信を行う接続型です。

Connector.open() メソッドで、接続先 URL を以下の形式で指定するとTCP通信:クライアント/サーバ型接続となります。
"socket://<ホスト名>:<ポート番号>"

以下に TCP 通信においてクライアント/サーバ型接続を行う場合のコード例を示します。

   
       SocketConnection sc = (SocketConnection)Connector.open("socket://example.com:12345");
       sc.openRemotePort(); // ドコモサーバに対してグローバルIPアドレスとポート番号の払い出し要求を行う。
       sc.connect(); // 端末とサーバ間のセッションを確立します。

       InputStream in = sc.openInputStream();
       OutputStream out = sc.openOutputStream();
       // 読み込み、書き込み処理

       in.close();
       out.close();
       sc.close(); // 接続を閉じてリソースを解放します。 
   
 

Peer-to-Peer 型接続
端末間で直接通信を行う接続型です。

Connector.open() メソッドで、接続先 URL を以下の形式で指定するとTCP通信:Peer-to-Peer型接続となります。
"socket://<P-to-P用URL>"

<P-to-P用URL> 部分には通信がPeer-to-Peer型接続であることを示す固定文字列を設定します。

以下に TCP 通信において 端末Aと端末BがサーバCより相互に通信相手に払い出されたIPアドレスとポート番号について通知を受け、 Peer-to-Peer 型接続を行う場合のコード例を示します。(この例ではサーバCとの通信でHTTPコネクションを使用し、通信相手アドレスを交換します。サーバはマッチングサーバ・ゲームサーバであることが想定されます)

   ※端末A※  
    // ① グローバルIPアドレスとポート番号をサーバーCに送信する。 //
    // ② サーバーCから端末BのグローバルIPアドレスとポート番号取得する。 //
    // ③ 端末Bに対してセッションの確立を行う。 //
    
       // ① //
       SocketConnection scA = (SocketConnection)Connector.open("socket://<P-to-P用URL>");
       scA.openRemotePort(); // グローバルIPアドレスとポート番号を払い出してもらう。
       String addressMobileA = scA.getLocalAddress(); // 端末Aに払い出されたIPアドレスを取得
       int portMobileA = scA.getLocalPort(); //端末Aに払い出されたポート番号を取得
       HttpConnection hcA = (HttpConnection)Connector.open("http://<サーバーCのホスト名>");
       //サーバCに対して端末Aに払い出されたIPアドレスとポート番号を送信
       
       // ② //
       hcA.connect(…);    
       //サーバCから、端末Bに払い出されたIPアドレスとポート番号を受信
       
       // ③ //
       scA.connect(addressMobileB, portMobileB); // 端末Bに対して Peer-to-Peer 接続要求を行う。
       
       InputStream in = scA.openInputStream();
       OutputStream out = scA.openOutputStream();
       // 読み込み、書き込み処理

       in.close();
       out.close();
       scA.close(); // 接続を閉じてリソースを解放します。 
       
  ※端末B※  
    // ① グローバルIPアドレスとポート番号をサーバーCに送信する。 
    // ② サーバCから端末AのグローバルIPアドレスとポート番号を取得する。 //
    // ③ 端末AのグローバルIPアドレスとポート番号からのセッション確立要求待ち状態に遷移する。 //
    
       // ① //
       SocketConnection scB = (SocketConnection)Connector.open("socket://<P-to-P用URL>");
       scB.openRemotePort(); // グローバルIPアドレスとポート番号を払い出してもらう。
       String addressMobileB = scB.getLocalAddress(); // 端末Bに払い出されたIPアドレスを取得
       int portMobileB = scB.getLocalPort(); //端末Bに払い出されたポート番号を取得
       HttpConnection hcB = (HttpConnection)Connector.open("http://<サーバーCのホスト名>");
       //サーバCに対して端末Bに払い出されたIPアドレスとポート番号を送信
       
       // ② //
       hcB.connect(…);
       //サーバCから、端末Aに払い出されたIPアドレスとポート番号を受信
       
       // ③ //
       scB.listen(addressMobileA, portMobileA); // 端末Aからの接続要求を待つ。
       
       InputStream in = scB.openInputStream();
       OutputStream out = scB.openOutputStream();
       // 読み込み、書き込み処理
       
       in.close();
       out.close();
       scB.close(); // 接続を閉じてリソースを解放します。 
       
 

導入されたバージョン:
Star-1.0

メソッドの概要
 void close()
          接続を閉じてリソースを解放します。
 void connect()
          クライアント/サーバ型接続にて、接続先に対してセッションを確立します。
 void connect(String host, int port)
          Peer-to-Peer 型接続にて、指定した接続先に対してセッションを確立します。
 String getAddress()
          接続先のアドレスを取得します。
 String getLocalAddress()
          端末に払い出された IP アドレスを取得します。
 int getLocalPort()
          端末に払い出されたポート番号を取得します。
 int getPort()
          接続先ポート番号を取得します。
 void listen(String host, int port)
          Peer-to-Peer 型接続にて、指定した接続先からの接続を待ち受けます。
 java.io.DataInputStream openDataInputStream()
          データ入力ストリームを取得します。
 java.io.DataOutputStream openDataOutputStream()
          データ出力ストリームを取得します。
 java.io.InputStream openInputStream()
          入力ストリームを取得します。
 java.io.OutputStream openOutputStream()
          出力ストリームを取得します。
 void openRemotePort()
          グローバルIPアドレスとポート番号の払い出し要求を行います。
 

メソッドの詳細

close

void close()
           throws java.io.IOException
接続を閉じてリソースを解放します。

ネットワークのリソース、及び送受信バッファ等のリソースは全て破棄されます。

定義:
インタフェース javax.microedition.io.Connection 内の close
例外:
ConnectionException -
(OUT_OF_SERVICE)
圏外(音声不可/パケット不可)になったことを検知した場合に発生します。
ConnectionException -
(USER_ABORT)
[Star-1.3 まで] ユーザ操作によって遷移した Suspended 状態から復帰したことを検知した場合に発生します。
[Star-1.5 以降] ユーザ操作によって通信が切断されたことを検知した場合に発生します。
java.io.InterruptedIOException -
[Star-1.3 まで] 別スレッドからのメソッド呼び出しにより通信が切断された場合や、 ユーザ操作以外の理由によって遷移した Suspended 状態から復帰したことを検知した場合に発生します。
[Star-1.5 以降] 別スレッドからのメソッド呼び出しにより通信が切断された場合や、 ユーザ操作以外の理由によって通信が切断されたことを検知した場合に発生します。
java.io.IOException -
現在の実装では発生することは有りません。

connect

void connect()
             throws java.io.IOException
クライアント/サーバ型接続にて、接続先に対してセッションを確立します。

Connector.open() メソッドの引数 name に指定した接続先 URL に対してセッションを確立します。

メソッドを呼び出した場合、Star アプリはサスペンドせずに接続処理を行います。 このメソッドはブロッキングメソッドとして動作します。

本メソッドはクライアント/サーバ型接続時に使用します。 Peer-to-Peer型接続時に本メソッドが呼ばれた場合は例外が発生します。

本メソッドはポートオープン状態で実行してください。 その他の状態で実行された場合は例外が発生します。

例外:
ConnectionException -
(OUT_OF_SERVICE)
圏外(音声不可/パケット不可)になったことを検知した場合に発生します。
IllegalStateException -
ポートオープン状態以外で実行さ