Module jdk.jdi

Class Connection

java.lang.Object
com.sun.jdi.connect.spi.Connection

public abstract class Connection extends Object
调试器与其调试的目标VM之间的连接。

连接表示调试器与目标VM之间的双向通信通道。当TransportService建立连接并成功与目标VM握手时,将创建一个连接。TransportService实现提供可靠的JDWP数据包传输服务,因此连接在调试器和目标VM之间提供可靠的JDWP数据包流。连接是面向流的,即写入连接的JDWP数据包按照写入顺序由目标VM读取。同样,目标VM写入连接的数据包按照写入顺序由调试器读取。

连接可以是打开的或关闭的。创建时是打开的,并保持打开状态直到关闭。一旦关闭,将保持关闭状态,任何尝试在其上调用I/O操作都将导致抛出一个ClosedConnectionException。可以通过调用isOpen方法来测试连接。

连接可以安全地被多个并发线程访问,尽管在任何给定时间最多只能有一个线程在读取,最多只能有一个线程在写入。

自1.5版本起:
1.5
  • Constructor Details

    • Connection

      public Connection()
      子类调用的构造函数。
  • Method Details

    • readPacket

      public abstract byte[] readPacket() throws IOException
      从目标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

      public abstract void writePacket(byte[] pkt) throws IOException
      向目标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

      public abstract void close() throws IOException
      关闭此连接。

      如果连接已关闭,则调用此方法不会产生任何效果。连接关闭后,任何进一步尝试调用readPacketwritePacket都将抛出一个ClosedConnectionException

      当前在I/O操作(readPacketwritePacket)中阻塞的任何线程都将抛出一个ClosedConnectionException)。

      此方法可以随时调用。但是,如果其他线程已经调用了它,则另一个调用将阻塞,直到第一个调用完成,然后将返回而不产生效果。

      抛出:
      IOException - 如果发生I/O错误
    • isOpen

      public abstract boolean isOpen()
      告知此连接是否打开。
      返回:
      如果此连接打开,则返回true