Connectionは、デバッガとターゲットVMとの間の双方向通信チャネルを表します。 Connectionは、TransportService
が接続を確立し、ターゲットVMと正常にハンドシェークしたときに作成されます。 TransportServiceの実装は、信頼性の高いJDWPパケット・トランスポート・サービスを提供します。同時に、ConnectionはデバッガとターゲットVM間でJDWPパケットの信頼性の高いフローを提供します。 Connectionはストリーム指向です。つまり、Connectionに書き込まれるJDWPパケットは書き込まれた順序でターゲットVMにより読み取られます。 同様に、ターゲットVMによってConnectionに書き込まれたパケットは、書き込まれた順序でデバッガによって読み込まれます。
接続は、オープンまたはクローズのどちらかです。 接続は作成時にオープンとなり、クローズまでオープンのままとなります。 いったんクローズされると、その状態が保持され、その接続で入出力操作を呼び出そうとすると、ClosedConnectionException
がスローされます。 接続は、isOpen
メソッドを呼び出すことによってテストできます。
Connectionは、複数のスレッドによる並行アクセスに対して安全ですが、どんなときも、最大1つのスレッドのみ読み取ることが可能であり、最大1つのスレッドのみ書き込むことができます。
- 導入されたバージョン:
- 1.5
-
コンストラクタのサマリー
コンストラクタ -
メソッドのサマリー
修飾子と型メソッド説明abstract void
close()
この接続を終了します。abstract boolean
isOpen()
この接続がオープンかどうかを通知します。abstract byte[]
ターゲットVMからパケットを読み取ります。abstract void
writePacket(byte[] pkt)
ターゲットVMにパケットを書き込みます。
-
コンストラクタの詳細
-
接続
public Connection()サブクラスが呼び出すためのコンストラクタ。
-
-
メソッドの詳細
-
readPacket
public abstract byte[] readPacket() throws IOExceptionターゲットVMからパケットを読み取ります。ターゲットVMからJDWPパケットを読み取ろうとします。 読取り操作は、無制限にブロックされる場合があり、パケットのすべてのバイトを読み取った場合だけ戻ります。ストリーム指向の通信プロトコルに基づくトランスポート・サービスの場合は、ストリームの終わりが検出されます。
パケットの読取りでは、パケットの長さ(l
ength
フィールド(パケットの最初の4バイト)の値により示される長さ)が11バイト以上であることをチェックする以外、パケットの一貫性チェックは行われません。length
フィールドの値が11未満の場合、IOException
がスローされます。受信したパケットの長さに等しい長さのバイト配列を返すか、ストリームの終わりが検出された場合は長さ0のbyte配列を返します。 ストリームの終わりがパケットのすべてのバイトのあとではなく一部のバイトのあとで検出された場合、I/Oエラーとみなされ、
IOException
がスローされます。 パケットの最初のバイトは、byte配列の要素0
に格納され、2番目のバイトは要素1
に格納される、のように格納されます。 byte配列のバイトは、JDWP仕様に従って配置されます。 つまり、パケットのすべてのフィールドはJDWP仕様で説明するようにビッグ・エンディアンの順になります。このメソッドはいつでも呼び出すことができます。 別のスレッドがこの接続で
readPacket
をすでに開始している場合、このメソッドの呼出しは最初の操作が完了するまでブロックされます。- 戻り値:
- ターゲットVMから読み取られたパケット
- 例外:
ClosedConnectionException
- 接続がクローズされた場合、またはreadPacketの進行中に別のスレッドが接続をクローズした場合。IOException
- パケットの長さ(最初の4バイトで示される)が11バイト未満である場合、または入出力エラーが発生した場合。
-
writePacket
public abstract void writePacket(byte[] pkt) throws IOExceptionターゲットVMにパケットを書き込みます。ターゲットVMにJDWPパケットの書き込みまたは送信を試みます。 書込み操作は、ターゲットVMにパケット全体が書き込まれたあとだけ戻ります。 パケット全体の書込みは、パケット全体がターゲットVMに転送されたことを意味するのではなく、すべてのバイトがトランスポート・サービスに書き込まれたことを意味します。 たとえば、TCP/IP接続に基づくトランスポート・サービスは、ネットワーク上への転送の前にパケットの一部またはすべてをバッファする場合があります。
このメソッドに提供されたbyte配列は、JDWP仕様に従って配置されているはずです。 つまり、パケットのすべてのフィールドはビッグ・エンディアンの順です。 最初のバイトである要素
pkt[0]
はlength
フィールドの最初のバイト、要素pkt[1]
はlength
フィールドの2番目のバイト、のようになっています。パケットの書込みでは、パケットの長さをチェックする以外、パケットの一貫性チェックは行われません。 パケット長のチェックでは、
length
フィールド(パケットの最初の4バイトで示される)の値が11以上であることをチェックする必要があります。 同時に、このメソッドに提供されたbyte配列の長さ、つまりpkt.length
は11以上である必要があり、length
フィールドの値以上である必要があります。 byte配列の長さがlength
フィールドの値よりも大きい場合、要素pkt[length]
以降のすべてのバイトは無視されます。 つまり、byte配列内のそのパケットに続く余分なバイトは無視され、ターゲットVMに転送されません。書込み操作はブロックされたり、すぐに終了したりする場合があります。 操作が正確にいつブロックされるかはトランスポート・サービスに依存します。 ターゲットVMにTCP/IP接続される場合は、ネットワークが混雑していたり基になるネットワーク・システムでパケットをバッファする領域が不足している場合は、writePacketメソッドがブロックされる場合があります。
このメソッドはいつでも呼び出すことができます。 別のスレッドがこのConnectionで書込み操作をすでに開始している場合、このメソッドの以降の呼出しは最初の操作が完了するまでブロックされます。
- パラメータ:
pkt
- ターゲットVMに書き込まれるパケット。- 例外:
ClosedConnectionException
- 接続がクローズされた場合、または書込み操作の進行中に別のスレッドが接続をクローズした場合。IOException
- 入出力エラーが発生した場合。IllegalArgumentException
-length
フィールドの値が無効な場合、またはbyte配列の長さが不足している場合。
-
close
public abstract void close() throws IOExceptionこの接続を終了します。接続がすでにクローズされている場合、このメソッドを呼び出しても何の効果もありません。 接続がクローズされたあとで、
readPacket
またはwritePacket
を呼び出そうとすると、ClosedConnectionException
がスローされます。入出力操作(
readPacket
またはwritePacket
)で現在ブロックされているスレッドは、ClosedConnectionException
をスローします)。このメソッドはいつでも呼び出すことができます。 ただし、ほかの何らかのスレッドがこのメソッドをすでに呼び出している場合、別の呼出しは最初の呼出しが完了するまでブロックされ、そのあと何も効果を発揮することなく戻ります。
- 例外:
IOException
- 入出力エラーが発生した場合
-
isOpen
public abstract boolean isOpen()この接続がオープンかどうかを通知します。- 戻り値:
- この接続が開いている場合にのみ
true
-