public abstract class Connection extends Object
Connection は、デバッガとターゲット VM との間の双方向通信チャネルを表します。Connection は、TransportService
が接続を確立し、ターゲット VM と正常にハンドシェークしたときに作成されます。TransportService の実装は、信頼性の高い JDWP パケットトランスポートサービスを提供します。同時に、Connection はデバッガとターゲット VM 間で JDWP パケットの信頼性の高いフローを提供します。Connection はストリーム指向です。つまり、Connection に書き込まれる JDWP パケットは書き込まれた順序でターゲット VM により読み取られます。同様に、ターゲット VM が Connection に書き込むパケットは、書き込まれた順序でデバッガに読み取られます。
接続は、オープンまたはクローズのどちらかです。接続は作成時にオープンとなり、クローズまでオープンのままとなります。いったんクローズされると、その状態が保持され、その接続で入出力操作を呼び出そうとすると、ClosedConnectionException
がスローされます。接続は、isOpen
メソッドを呼び出すことによってテストできます。
Connection は、複数のスレッドによる並行アクセスに対して安全ですが、どんなときも、最大 1 つのスレッドのみ読み取ることが可能であり、最大 1 つのスレッドのみ書き込むことができます。
コンストラクタと説明 |
---|
Connection() |
修飾子と型 | メソッドと説明 |
---|---|
abstract void |
close()
この接続を終了します。
|
abstract boolean |
isOpen()
この接続がオープンかどうかを通知します。
|
abstract byte[] |
readPacket()
ターゲット VM からパケットを読み取ります。
|
abstract void |
writePacket(byte[] pkt)
ターゲット VM にパケットを書き込みます。
|
public abstract byte[] readPacket() throws IOException
ターゲット VM から JDWP パケットを読み取ろうとします。読み取り操作は、無制限にブロックされる場合があり、パケットのすべてのバイトを読み取った場合だけ戻ります。ストリーム指向の通信プロトコルに基づくトランスポートサービスの場合は、ストリームの終わりが検出されます。
パケットの読み取りでは、パケットの長さ (length フィールド (パケットの最初の 4 バイト) の値により示される長さ) が 11 バイト以上であることをチェックする以外、パケットの一貫性チェックは行われません。length フィールドの値が 11 未満の場合、IOException がスローされます。
受信したパケットの長さに等しい長さのバイト配列を返すか、ストリームの終わりが検出された場合は長さ 0 の byte 配列を返します。ストリームの終わりがパケットのすべてのバイトのあとではなく一部のバイトのあとで検出された場合、I/O エラーとみなされ、IOException がスローされます。パケットの最初のバイトは、byte 配列の要素 0 に格納され、2 番目のバイトは要素 1 に格納される、のように格納されます。byte 配列のバイトは、JDWP 仕様に従って配置されます。つまり、パケットのすべてのフィールドは JDWP 仕様で説明するようにビッグエンディアンの順になります。
このメソッドはいつでも呼び出すことができます。別のスレッドがこの接続で readPacket
をすでに開始している場合、このメソッドの呼び出しは最初の操作が完了するまでブロックされます。
ClosedConnectionException
- 接続がクローズされた場合、または readPacket の進行中に別のスレッドが接続をクローズした場合。IOException
- パケットの長さ (最初の 4 バイトで示される) が 11 バイト未満である場合、または入出力エラーが発生した場合。public abstract void writePacket(byte[] pkt) throws IOException
ターゲット 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 配列の長さが不足している場合。public abstract void close() throws IOException
接続がすでにクローズされている場合、このメソッドを呼び出しても何の効果もありません。接続がクローズされたあとで、readPacket
または writePacket
を呼び出そうとすると、ClosedConnectionException
がスローされます。
入出力操作 (readPacket
または writePacket
) で現在ブロックされているスレッドは、ClosedConnectionException
をスローします)。
このメソッドはいつでも呼び出すことができます。ただし、ほかの何らかのスレッドがこのメソッドをすでに呼び出している場合、別の呼び出しは最初の呼び出しが完了するまでブロックされ、そのあと何も効果を発揮することなく戻ります。
IOException
- 入出力エラーが発生した場合public abstract boolean isOpen()
Copyright © 1999, 2013, Oracle and/or its affiliates. All rights reserved.