Класс Connection
- java.lang.Object
-
- com.sun.jdi.connect.spi.Connection
public abstract class Connection extends Object
Соединение между отладчиком и целевой виртуальной машиной, которую он отлаживает.
Класс Connection представляет двунаправленный канал связи между отладчиком и целевой виртуальной машиной. Connection создается, когда TransportService устанавливает соединение и успешно выполняет рукопожатие с целевой виртуальной машиной. Реализация TransportService предоставляет надежную службу транспортировки пакетов JDWP, а следовательно, Connection обеспечивает надежный поток пакетов JDWP между отладчиком и целевой виртуальной машиной. Connection ориентирован на поток, то есть пакеты JDWP, записанные в соединение, считываются целевой виртуальной машиной в том порядке, в котором они были записаны. Аналогично пакеты, записанные в Connection целевой виртуальной машиной, считываются отладчиком в том порядке, в котором они были записаны.
Соединение может быть открытым или закрытым. Оно открыто при создании и остается открытым до закрытия. После закрытия оно остается закрытым, и любая попытка вызвать операцию ввода-вывода приведет к сбросу ClosedConnectionException. Соединение можно проверить, вызвав метод isOpen.
Класс Connection безопасен для доступа из нескольких потоков одновременно, хотя в любой момент времени может быть только один поток чтения и один поток записи.
- Since:
- 1.5
Конструкторы
| Конструктор | Описание |
|---|---|
Connection() |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract void |
close() |
Закрывает это соединение. |
abstract boolean |
isOpen() |
Указывает, открыто ли это соединение. |
abstract byte[] |
readPacket() |
Считывает пакет из целевой виртуальной машины. |
abstract void |
writePacket(byte[] pkt) |
Записывает пакет в целевую виртуальную машину. |
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Конструкторы
Connection
public Connection()
Методы
readPacket
public abstract byte[] readPacket()
throws IOException
Считывает пакет из целевой виртуальной машины.
Попытка прочитать пакет JDWP из целевой виртуальной машины. Операция чтения может блокироваться неопределенно и возвращается только тогда, когда она считывает все байты пакета или, в случае службы транспортировки, основанной на потоковом протоколе связи, достигает конца потока.
При чтении пакета не выполняется проверка целостности пакета, кроме проверки, что длина пакета (как указано значением поля length, первые четыре байта пакета) составляет 11 или более байтов. Если значение length меньше 11, то выбрасывается IOException.
Возвращает массив байтов длиной, равной длине принятого пакета, или массив байтов длиной 0, когда встречается конец потока. Если конец потока встречается после чтения некоторых, но не всех байтов пакета, то это считается ошибкой ввода-вывода, и выбрасывается IOException. Первый байт пакета хранится в элементе 0 массива байтов, второй в элементе 1, и так далее. Байты в массиве байтов выстроены в соответствии с спецификацией JDWP. То есть все поля в пакете находятся в порядке big endian в соответствии со спецификацией JDWP.
Этот метод можно вызывать в любое время. Если другой поток уже инициировал операцию readPacket для этого соединения, то вызов этого метода будет блокироваться до завершения первой операции.
- Возвращает:
- пакет, считанный из целевой виртуальной машины
- Исключения:
-
ClosedConnectionException- Если соединение закрыто или другой поток закрывает соединение во время выполнения readPacket. -
IOException- Если длина пакета (как указано первыми 4 байтами) меньше 11 байтов или возникает ошибка ввода-вывода.
writePacket
public abstract void writePacket(byte[] pkt)
throws IOException
Записывает пакет в целевую виртуальную машину.
Попытка записать или отправить пакет JDWP в целевую виртуальную машину. Операция записи возвращается только после записи всего пакета в целевую виртуальную машину. Запись всего пакета не означает, что весь пакет был передан целевой виртуальной машине, а скорее, что все байты были записаны в службу транспортировки. Служба транспортировки, основанная на соединении TCP/IP, например, может буферизовать часть или весь пакет перед передачей по сети.
Массив байтов, предоставленный этому методу, должен быть выстроен в соответствии с спецификацией JDWP. То есть все поля в пакете находятся в порядке big endian. Первый байт, то есть элемент pkt[0], является первым байтом поля length. pkt[1] — второй байт поля length, и так далее.
При записи пакета не выполняется проверка целостности пакета, кроме проверки длины пакета. Проверка длины пакета требует проверки, что значение поля length (как указано первыми четырьмя байтами пакета) составляет 11 или более. Следовательно, длина предоставленного массива байтов, то есть pkt.length, должна быть 11 или более и должна быть равна или больше значения поля length. Если длина массива байтов больше значения поля length, все байты с элемента pkt[length] и далее игнорируются. Другими словами, любые дополнительные байты, следующие за пакетом в массиве байтов, игнорируются и не будут переданы целевой виртуальной машине.
Операция записи может блокироваться или завершаться немедленно. Точные обстоятельства, при которых операция блокируется, зависят от службы транспортировки. В случае соединения TCP/IP с целевой виртуальной машиной метод writePacket может блокироваться при сетевой загрузке или недостаточном пространстве для буферизации пакета в базовой сетевой системе.
Этот метод можно вызывать в любое время. Если другой поток уже инициировал операцию записи для этого Connection, то последующий вызов этого метода будет блокироваться до завершения первой операции.
- Параметры:
-
pkt- Пакет, который нужно записать в целевую виртуальную машину. - Исключения:
-
ClosedConnectionException- Если соединение закрыто или другой поток закрывает соединение во время операции записи. -
IOException- Если возникает ошибка ввода-вывода. -
IllegalArgumentException- Если значение поляlengthнедействительно или массив байтов имеет недостаточную длину.
close
public abstract void close()
throws IOException
Закрывает это соединение.
Если соединение уже закрыто, то вызов этого метода не оказывает никакого влияния. После закрытия соединения любые дальнейшие попытки вызовов readPacket или writePacket вызовут ClosedConnectionException.
Любой поток, который в настоящее время заблокирован в операции ввода-вывода (readPacket или writePacket), вызовет ClosedConnectionException.
Этот метод может быть вызван в любое время. Однако, если какой-либо другой поток уже вызвал его, то другой вызов будет блокироваться до завершения первого вызова, после чего он вернется без эффекта.
- Исключения:
-
IOException- Если возникает ошибка ввода-вывода
isOpen
public abstract boolean isOpen()
Указывает, открыто ли это соединение.
- Возвращает:
-
trueтогда и только тогда, когда это соединение открыто
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/jdk.jdi/com/sun/jdi/connect/spi/Connection.html