Класс 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 |
Записывает пакет в целевую виртуальную машину. |
Подробное описание конструкторов
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 в этом соединении, то вызов этого метода будет заблокирован до завершения первой операции.
- Returns:
- пакет, прочитанный из целевой виртуальной машины
- Throws:
-
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 может заблокироваться, если есть задержка в сети или недостаточно места для буферизации пакета в основной сетевой системе.
Этот метод может быть вызван в любое время. Если другой поток уже инициировал операцию записи в этом соединении, последующий вызов этого метода будет заблокирован до завершения первой операции.
- Parameters:
-
pkt- Пакет для записи в целевую виртуальную машину. - Throws:
-
ClosedConnectionException- Если соединение закрыто или другой поток закрывает соединение во время операции записи. -
IOException- Если произошла ошибка ввода-вывода. -
IllegalArgumentException- Если значение поляlengthнедействительно или массив байтов недостаточной длины.
close
public abstract void close() throws IOException
Если соединение уже закрыто, то вызов этого метода не оказывает никакого влияния. После закрытия соединения любые дальнейшие вызовы readPacket или writePacket приведут к выбрасыванию исключения ClosedConnectionException.
Любой поток, в данный момент заблокированный в операции ввода-вывода (readPacket или writePacket), выбросит исключение ClosedConnectionException.
Этот метод может быть вызван в любое время. Однако, если его уже вызвал другой поток, то очередной вызов заблокируется до завершения первого вызова, после чего он вернется без эффекта.
- Throws:
-
IOException- Если произошла ошибка ввода-вывода
isOpen
public abstract boolean isOpen()
- Returns:
-
trueесли и только если это соединение открыто
© 1993, 2023, 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/21/docs/api/jdk.jdi/com/sun/jdi/connect/spi/Connection.html