- java.lang.Object
-
- com.sun.jdi.connect.spi.Connection
-
public abstract class Connectionextends Object
调试器与其调试的目标VM之间的连接。Connection表示调试器和目标VM之间的双向通信通道。 当
TransportService
建立连接并成功与目标VM握手时,将创建连接。 TransportService实现提供可靠的JDWP数据包传输服务,因此Connection在调试器和目标VM之间提供可靠的JDWP数据包流。 Connection是面向流的,也就是说,写入连接的JDWP数据包是由目标VM按写入顺序读取的。 类似地,调试器按照编写它们的顺序读取目标VM写入连接的数据包。连接是打开还是关闭。 它在创建时是开放的,并且在关闭之前保持打开状态。 一旦关闭,它将保持关闭状态,并且任何在其上调用I / O操作的尝试都将导致抛出
ClosedConnectionException
。 可以通过调用isOpen
方法来测试连接。连接对于多个并发线程的访问是安全的,尽管最多一个线程可能正在读取,并且最多一个线程可能在任何给定时间写入。
- 从以下版本开始:
- 1.5
-
-
构造方法摘要
构造方法 构造器 描述 Connection()
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 abstract void
close()
关闭此连接。abstract boolean
isOpen()
判断此连接是否已打开。abstract byte[]
readPacket()
从目标VM读取数据包。abstract void
writePacket(byte[] pkt)
将数据包写入目标VM。
-
-
-
方法详细信息
-
readPacket
public abstract byte[] readPacket() throws IOException
从目标VM读取数据包。尝试从目标VM读取JDWP数据包。 读取操作可以无限期地阻塞,并且仅在读取分组的所有字节时返回,或者在基于面向流的通信协议的传输服务的情况下,遇到流的末尾。
除了检查数据包的长度(由
length
字段的值表示,数据包的前四个字节)是11个或更多字节之外,读取数据包不会对数据包进行任何完整性检查。 如果length
值的值小于11,则抛出IOException
。返回长度等于接收数据包长度的字节数组,或遇到流结束时长度为0的字节数组。 如果在读取数据包的某些字节之后遇到流结束,则会将其视为I / O错误并抛出
IOException
。 数据包的第一个字节存储在字节数组的元素1
,第二个字节存储在元素0
中,依此类推。 字节数组中的字节按照JDWP specification进行布局 。 也就是说,根据JDWP规范,数据包中的所有字段都是大端序。可以随时调用此方法。 如果另一个线程已在此连接上启动了
readPacket
,则此方法的调用将阻塞,直到第一个操作完成。- 结果
- 从目标VM读取的数据包
- 异常
-
ClosedConnectionException
- 如果连接已关闭,或者另一个线程在readPacket正在进行时关闭连接。 -
IOException
- 如果数据包的长度(由前4个字节指示)小于11个字节,或者发生I / O错误。
-
writePacket
public abstract void writePacket(byte[] pkt) throws IOException
将数据包写入目标VM。尝试将JDWP数据包写入或发送到目标VM。 写操作仅在将整个数据包写入目标VM后返回。 写入整个数据包并不意味着整个数据包已经传输到目标VM,而是所有字节都已写入传输服务。 例如,基于TCP / IP连接的传输服务可以在网络上传输之前缓冲一些或全部分组。
提供给此方法的字节数组应按照JDWP specification进行布局 。 也就是说,数据包中的所有字段都是大端序。 第一个字节,即元素
pkt[0]
,是length
字段的第一个字节。pkt[1]
是length
字段的第二个字节,依此类推。除了检查数据包长度之外,写入数据包不会对数据包进行任何完整性检查。 检查数据包长度需要检查
length
字段的值(由数据包的前四个字节指示)是否为11或更大。 因此,提供给此方法的字节数组的长度(即pkt.length
)必须为11或更大,并且必须等于或大于length
字段的值。 如果字节数组的长度大于length
字段的值,则忽略元素pkt[length]
以后的所有字节。 换句话说,字节数组中数据包后面的任何附加字节都将被忽略,并且不会传输到目标VM。写操作可以阻止或立即完成。 操作块的确切情况取决于传输服务。 在与目标VM的TCP / IP连接的情况下,如果存在网络拥塞或者没有足够的空间来缓冲底层网络系统中的分组,则writePacket方法可以阻止。
可以随时调用此方法。 如果另一个线程已经在此Connection上启动了写操作,则此方法的后续调用将阻塞,直到第一个操作完成。
- 参数
-
pkt
- 要写入目标VM的数据包。 - 异常
-
ClosedConnectionException
- 如果连接已关闭,或者其他线程在写入操作正在进行时关闭连接。 -
IOException
- 如果发生I / O错误。 -
IllegalArgumentException
- 如果length
字段的值无效,或者字节数组的长度不足。
-
close
public abstract void close() throws IOException
关闭此连接。如果连接已关闭,则调用此方法无效。 连接关闭后,任何进一步的尝试调用
readPacket
或writePacket
将抛出ClosedConnectionException
。当前在I / O操作中阻塞的任何线程(
readPacket
或writePacket
)将抛出ClosedConnectionException
)。可以随时调用此方法。 但是,如果某个其他线程已经调用了它,那么另一个调用将阻塞,直到第一次调用完成,之后它将返回而不起作用。
- 异常
-
IOException
- 如果发生I / O错误
-
isOpen
public abstract boolean isOpen()
判断此连接是否已打开。- 结果
-
true
if and only if this connection is open
-
-