传输服务是这个类的一个具体子类,具有零参数构造函数并实现下面指定的抽象方法。它是由Transport
用于调试器和目标VM之间连接的基础服务。
传输服务用于建立调试器和目标VM之间的连接,并通过底层通信协议传输Java调试线协议(JDWP)数据包。实质上,传输服务实现将JDWP(如在JDWP规范中指定的)绑定到底层通信协议。传输服务实现提供可靠的JDWP数据包传输服务。JDWP数据包在目标VM之间发送和接收,不会重复或丢失数据。传输服务实现可以基于可靠或不可靠的底层通信协议。如果底层通信协议是可靠的,那么传输服务实现可能相对简单,可能只需要将JDWP数据包作为底层通信协议的有效载荷进行传输。在不可靠通信协议的情况下,传输服务实现可能包括额外的协议支持,以确保数据包不会重复,并且不会丢失数据。这些协议的细节特定于实现,但可能涉及诸如传输控制协议(TCP)中使用的带重传的肯定确认技术等技术(请参阅RFC 793)。
传输服务可用于启动与目标VM的连接。通过调用attach(java.lang.String, long, long)
方法来实现。另外,传输服务可以监听并接受目标VM发起的连接。通过调用startListening(String)
方法将传输设置为监听模式。然后使用accept(com.sun.jdi.connect.spi.TransportService.ListenKey, long, long)
方法来接受目标VM发起的连接。
- 自版本:
- 1.5
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic class
传输服务的能力。static class
一个监听键。 -
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionabstract Connection
accept
(TransportService.ListenKey listenKey, long acceptTimeout, long handshakeTimeout) 接受来自目标VM的连接。abstract Connection
连接到指定地址。abstract TransportService.Capabilities
返回传输服务的能力。abstract String
返回传输服务的描述。abstract String
name()
返回用于标识传输服务的名称。abstract TransportService.ListenKey
在传输服务选择的地址上进行监听。abstract TransportService.ListenKey
startListening
(String address) 在指定地址上监听传入连接。abstract void
stopListening
(TransportService.ListenKey listenKey) 停止监听传入连接。
-
Constructor Details
-
TransportService
public TransportService()子类调用的构造函数。
-
-
Method Details
-
name
返回用于标识传输服务的名称。- 返回:
- 传输服务的名称
-
description
返回传输服务的描述。- 返回:
- 传输服务的描述
-
capabilities
返回传输服务的能力。- 返回:
- 传输服务的能力
-
attach
public abstract Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException 连接到指定地址。连接到指定地址并返回表示与目标VM之间的双向通信通道的连接。
连接到目标VM涉及两个步骤:首先,建立到指定地址的连接。然后进行握手以确保连接到目标VM。握手涉及交换字符串JDWP-Handshake,如在Java调试线协议规范中指定。
- 参数:
-
address
- 目标VM的地址。 -
attachTimeout
- 如果此传输服务支持附加超时,并且attachTimeout
为正值,则指定连接到目标VM时要使用的超时(多或少)(以毫秒为单位)。如果传输服务不支持附加超时,或者attachTimeout
指定为零,则不带任何超时进行附加。 -
handshakeTimeout
- 如果此传输服务支持握手超时,并且handshakeTimeout
为正值,则指定握手与目标VM握手时要使用的超时(多或少)(以毫秒为单位)。超时的确切用法特定于传输服务。例如,传输服务可以将握手超时用作等待来自目标VM的JDWP-Handshake消息的字符间超时。另外,传输服务可以将握手超时用作握手交换的持续时间的超时。如果传输服务不支持握手超时,或者handshakeTimeout
指定为零,则握手不会超时,如果没有来自目标VM的响应。 - 返回:
- 表示与目标VM之间的双向通信通道的连接。
- 抛出:
-
TransportTimeoutException
- 如果建立连接时发生超时。 -
IOException
- 如果发生I/O错误(包括握手时的超时)。 -
IllegalArgumentException
- 如果地址无效或附加超时或握手超时的值为负。 - 参见:
-
startListening
在指定地址上监听传入连接。此方法启动传输服务在指定地址上监听,以便随后接受传入连接。它不会等待直到建立传入连接。
- 参数:
-
address
- 要监听连接的地址,或null
以监听传输服务选择的地址。 - 返回:
-
用于在后续调用中使用的监听键
accept
或stopListening
方法。 - 抛出:
-
IOException
- 如果发生I/O错误。 -
IllegalArgumentException
- 如果特定地址无效
-
startListening
在传输服务选择的地址上监听。此便利方法的工作方式类似于调用
startListening(null)
。- 返回:
-
用于在后续调用中使用的监听键
accept
或stopListening
方法。 - 抛出:
-
IOException
- 如果发生I/O错误。
-
stopListening
停止监听传入连接。在另一个线程被阻塞在
accept
中,使用相同的监听键等待接受连接时调用此方法将导致该线程抛出IOException。如果在accept中被阻塞的线程已经接受了来自目标VM的连接并正在与目标VM握手过程中,则调用此方法不会导致线程抛出异常。- 参数:
-
listenKey
- 从先前调用startListening(String)
或startListening()
获取的监听键。 - 抛出:
-
IllegalArgumentException
- 如果监听键无效 -
IOException
- 如果发生I/O错误。
-
accept
public abstract Connection accept(TransportService.ListenKey listenKey, long acceptTimeout, long handshakeTimeout) throws IOException 接受来自目标VM的连接。等待(无限期或带有超时)接受来自目标VM的连接。返回表示与目标VM之间的双向通信通道的连接。
从目标VM接受连接涉及两个步骤。首先,传输服务等待接受来自目标VM的连接。一旦建立连接,将执行握手以确保连接确实是到目标VM的。握手涉及交换字符串JDWP-Handshake,如在Java调试线协议规范中指定。
- 参数:
-
listenKey
- 从先前调用startListening(String)
或startListening()
获取的监听键。 -
acceptTimeout
- 如果此传输服务支持接受超时,并且acceptTimeout
为正值,则在等待目标VM连接时最多阻塞acceptTimeout
毫秒,或更少。如果传输服务不支持接受超时,或者acceptTimeout
为零,则无限期地阻塞等待目标VM连接。 -
handshakeTimeout
- 如果此传输服务支持握手超时,并且handshakeTimeout
为正值,则它指定在与目标VM握手时使用的超时,以毫秒为单位(或更少)。超时的确切使用方式特定于传输服务。例如,传输服务可以将握手超时用作等待来自目标VM的JDWP-Handshake消息的字符间超时。另外,传输服务可以将超时用作握手交换的持续时间的超时。如果传输服务不支持握手超时,或者如果handshakeTimeout
指定为零,则如果没有来自目标VM的响应,则握手不会超时。 - 返回:
- 表示与目标VM的双向通信通道的连接。
- 抛出:
-
TransportTimeoutException
- 在等待目标VM连接时发生超时。 -
IOException
- 如果发生I/O错误(包括握手时的超时)。 -
IllegalArgumentException
- 如果acceptTimeout参数的值,或handshakeTimeout为负值,或提供了无效的监听键。 -
IllegalStateException
- 如果使用此监听键已调用stopListening
,并且传输服务不再监听入站连接。 - 参见:
-