连接表示调试器与目标VM之间的双向通信通道。当TransportService建立连接并成功与目标VM握手时,将创建一个连接。TransportService实现提供可靠的JDWP数据包传输服务,因此连接在调试器和目标VM之间提供可靠的JDWP数据包流。连接是面向流的,即写入连接的JDWP数据包按照写入顺序由目标VM读取。同样,目标VM写入连接的数据包按照写入顺序由调试器读取。
连接可以是打开的或关闭的。创建时是打开的,并保持打开状态直到关闭。一旦关闭,将保持关闭状态,任何尝试在其上调用I/O操作都将导致抛出一个ClosedConnectionException。可以通过调用isOpen
方法来测试连接。
连接可以安全地被多个并发线程访问,尽管在任何给定时间最多只能有一个线程在读取,最多只能有一个线程在写入。
- 自1.5版本起:
- 1.5
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionabstract void
close()
关闭此连接。abstract boolean
isOpen()
告知此连接是否打开。abstract byte[]
从目标VM读取数据包。abstract void
writePacket
(byte[] pkt) 向目标VM写入数据包。
-
Constructor Details
-
Connection
public Connection()子类调用的构造函数。
-
-
Method Details
-
readPacket
从目标VM读取数据包。尝试从目标VM读取JDWP数据包。读取操作可能会无限期地阻塞,并且只有在读取完整数据包时才返回,或者在基于流式通信协议的传输服务中遇到流的末尾时才返回。
读取数据包除了检查数据包的长度(由数据包的前四个字节的
length
字段的值指示)是否为11个或更多字节之外,不进行任何完整性检查。如果length
值小于11,则会抛出IOException
。返回一个长度等于接收到的数据包长度的字节数组,或者在遇到流的末尾时返回长度为0的字节数组。如果在读取部分但不是全部数据包字节后遇到流的末尾,则被视为I/O错误,并抛出
IOException
。数据包的第一个字节存储在字节数组的元素0
中,第二个字节存储在元素1
中,依此类推。字节数组中的字节按照JDWP规范的大端顺序排列。也就是说,数据包中的所有字段都按照JDWP规范的大端顺序排列。此方法可以随时调用。如果另一个线程已经在此连接上启动了一个
readPacket
操作,则此方法的调用将阻塞,直到第一个操作完成。- 返回:
- 从目标VM读取的数据包
- 抛出:
-
ClosedConnectionException
- 如果连接已关闭,或另一个线程在读取数据包时关闭了连接。 -
IOException
- 如果数据包的长度(由前4个字节指示)小于11字节,或发生I/O错误。
-
writePacket
向目标VM写入数据包。尝试向目标VM写入JDWP数据包。写入操作仅在将整个数据包写入目标VM后才返回。写入整个数据包并不意味着整个数据包已传输到目标VM,而是所有字节已写入传输服务。例如,基于TCP/IP连接的传输服务可能在网络上传输之前缓冲部分或全部数据包。
提供给此方法的字节数组应按照JDWP规范排列。也就是说,数据包中的所有字段都按照大端顺序排列。第一个字节,即元素
pkt[0]
,是length
字段的第一个字节。pkt[1]
是length
字段的第二个字节,依此类推。写入数据包除了检查数据包长度外不进行任何完整性检查。检查数据包长度需要检查
length
字段的值(由数据包的前四个字节指示)是否为11或更大。因此,提供给此方法的字节数组的长度,即pkt.length
,必须为11或更多,并且必须等于或大于length
字段的值。如果字节数组的长度大于length
字段的值,则从元素pkt[length]
开始的所有字节将被忽略。换句话说,跟随数据包的字节数组中的任何附加字节都将被忽略,并且不会传输到目标VM。写入操作可能会阻塞,也可能立即完成。操作阻塞的确切情况取决于传输服务。在与目标VM的TCP/IP连接的情况下,如果网络拥塞或底层网络系统中没有足够的空间来缓冲数据包,则writePacket方法可能会阻塞。
此方法可以随时调用。如果另一个线程已经在此连接上启动了写操作,则对此方法的后续调用将阻塞,直到第一个操作完成。
- 参数:
-
pkt
- 要写入目标VM的数据包。 - 抛出:
-
ClosedConnectionException
- 如果连接已关闭,或另一个线程在写操作进行中关闭了连接。 -
IOException
- 如果发生I/O错误。 -
IllegalArgumentException
- 如果length
字段的值无效,或字节数组长度不足。
-
close
关闭此连接。如果连接已关闭,则调用此方法不会产生任何效果。连接关闭后,任何进一步尝试调用
readPacket
或writePacket
都将抛出一个ClosedConnectionException
。当前在I/O操作(
readPacket
或writePacket
)中阻塞的任何线程都将抛出一个ClosedConnectionException
)。此方法可以随时调用。但是,如果其他线程已经调用了它,则另一个调用将阻塞,直到第一个调用完成,然后将返回而不产生效果。
- 抛出:
-
IOException
- 如果发生I/O错误
-
isOpen
public abstract boolean isOpen()告知此连接是否打开。- 返回:
-
如果此连接打开,则返回
true
-