Spec-Zone.ru › OpenJDK 27

Класс AsynchronousSocketChannel

java.lang.Object
java.nio.channels.AsynchronousSocketChannel
Все реализуемые интерфейсы:
Closeable, AutoCloseable, AsynchronousByteChannel, AsynchronousChannel, Channel, NetworkChannel
public abstract class AsynchronousSocketChannel extends Object implements AsynchronousByteChannel, NetworkChannel
Асинхронный канал для сокетов, устанавливающих соединения с потоковой передачей данных.

Асинхронные сокетные каналы создаются одним из двух способов. Новый AsynchronousSocketChannel создается вызовом одного из методов open, определенных этим классом. Созданный канал открыт, но еще не подключен. Подключенный AsynchronousSocketChannel создается при установлении соединения с сокетом AsynchronousServerSocketChannel. Невозможно создать асинхронный сокетный канал для произвольного уже существующего socket.

Созданный канал подключается вызовом метода connect; после подключения канал остается подключенным до тех пор, пока он не будет закрыт. Чтобы определить, подключен ли сокетный канал, можно вызвать метод getRemoteAddress. Попытка выполнить операцию ввода-вывода для неподключенного канала приводит к выбросу исключения NotYetConnectedException.

Каналы этого типа безопасны для использования несколькими параллельными потоками. Они поддерживают параллельное чтение и запись, однако в каждый момент времени может выполняться не более одной операции чтения и одной операции записи. Если поток инициирует операцию чтения до завершения предыдущей операции чтения, будет выброшено исключение ReadPendingException. Аналогично, попытка инициировать операцию записи до завершения предыдущей операции записи приведет к выбросу исключения WritePendingException.

Параметры сокета настраиваются с помощью метода setOption. Асинхронные сокетные каналы поддерживают следующие параметры:

Параметры сокета
Имя параметра Описание
SO_SNDBUF Размер буфера отправки сокета
SO_RCVBUF Размер буфера приема сокета
SO_KEEPALIVE Поддержание соединения активным
SO_REUSEADDR Повторное использование адреса
TCP_NODELAY Отключение алгоритма Нейгла
Также могут поддерживаться дополнительные параметры, зависящие от реализации.

Тайм-ауты

Методы read и write, определенные этим классом, позволяют задать тайм-аут при инициации операции чтения или записи. Если тайм-аут истекает до завершения операции, она завершается с исключением InterruptedByTimeoutException. Тайм-аут может привести к несогласованному состоянию канала или базового соединения. Если реализация не может гарантировать, что байты не были прочитаны из канала, она переводит канал в зависящее от реализации состояние ошибки. Последующая попытка инициировать операцию read приводит к выбросу исключения времени выполнения, тип которого не определен. Аналогично, если время ожидания операции write истекает и реализация не может гарантировать, что байты не были записаны в канал, последующие попытки write в канал приводят к выбросу исключения времени выполнения, тип которого не определен. При истечении тайм-аута состояние ByteBuffer или последовательности буферов, используемых для операции ввода-вывода, не определено. Буферы следует отбросить или, по крайней мере, не обращаться к ним, пока канал остается открытым. Все методы, принимающие параметры тайм-аута, считают, что значения, меньшие или равные нулю, означают отсутствие тайм-аута для операции ввода-вывода.

Начиная с:
1.7

Краткое описание конструкторов

AsynchronousSocketChannel(AsynchronousChannelProvider provider)
Модификатор Конструктор Описание
protected
Инициализирует новый экземпляр этого класса.

Краткое описание методов

Модификатор и тип Метод Описание
abstract AsynchronousSocketChannel bind(SocketAddress local)
Привязывает сокет канала к локальному адресу.
abstract Future<Void> connect(SocketAddress remote)
Подключает этот канал.
abstract <A> void connect(SocketAddress remote, A attachment, CompletionHandler<Void, ? super A> handler)
Подключает этот канал.
abstract SocketAddress getLocalAddress()
Возвращает адрес сокета, к которому привязан сокет этого канала.
abstract SocketAddress getRemoteAddress()
Возвращает удаленный адрес, к которому подключен сокет этого канала.
static AsynchronousSocketChannel open()
Открывает асинхронный сокетный канал.
static AsynchronousSocketChannel open(AsynchronousChannelGroup group)
Открывает асинхронный сокетный канал.
final AsynchronousChannelProvider provider()
Возвращает поставщика, создавшего этот канал.
abstract Future<Integer> read(ByteBuffer dst)
Считывает последовательность байтов из этого канала в указанный буфер.
abstract <A> void read(ByteBuffer[] dsts, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long, ? super A> handler)
Считывает последовательность байтов из этого канала в подпоследовательность указанных буферов.
abstract <A> void read(ByteBuffer dst, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer, ? super A> handler)
Считывает последовательность байтов из этого канала в указанный буфер.
final <A> void read(ByteBuffer dst, A attachment, CompletionHandler<Integer, ? super A> handler)
Считывает последовательность байтов из этого канала в указанный буфер.
abstract <T> AsynchronousSocketChannel setOption(SocketOption<T> name, T value)
Задает значение параметра сокета.
abstract AsynchronousSocketChannel shutdownInput()
Отключает чтение в соединении, не закрывая канал.
abstract AsynchronousSocketChannel shutdownOutput()
Отключает запись в соединении, не закрывая канал.
abstract Future<Integer> write(ByteBuffer src)
Записывает последовательность байтов из указанного буфера в этот канал.
abstract <A> void write(ByteBuffer[] srcs, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long, ? super A> handler)
Записывает последовательность байтов из подпоследовательности указанных буферов в этот канал.
abstract <A> void write(ByteBuffer src, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer, ? super A> handler)
Записывает последовательность байтов из указанного буфера в этот канал.
final <A> void write(ByteBuffer src, A attachment, CompletionHandler<Integer, ? super A> handler)
Записывает последовательность байтов из указанного буфера в этот канал.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создает и возвращает копию этого объекта.
boolean equals(Object obj)
Показывает, равен ли этот объект другому объекту.
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удален в будущей версии.
Финализация объявлена устаревшей и будет удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает хеш-код этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно путем уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно путем уведомления или прерывания, либо до истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно путем уведомления или прерывания, либо до истечения заданного промежутка реального времени.

Методы, объявленные в интерфейсе AsynchronousChannel

close
Модификатор и тип Метод Описание
void close()
Закрывает этот канал.

Методы, объявленные в интерфейсе Channel

isOpen
Модификатор и тип Метод Описание
boolean isOpen()
Показывает, открыт ли этот канал.

Методы, объявленные в интерфейсе NetworkChannel

getOption, supportedOptions
Модификатор и тип Метод Описание
<T> T getOption(SocketOption<T> name)
Возвращает значение параметра сокета.
Set<SocketOption<?>> supportedOptions()
Возвращает набор параметров сокета, поддерживаемых этим каналом.

Подробное описание конструкторов

AsynchronousSocketChannel

protected AsynchronousSocketChannel(AsynchronousChannelProvider provider)
Инициализирует новый экземпляр этого класса.
Параметры:
provider — Провайдер, создавший этот канал

Подробное описание методов

provider

public final AsynchronousChannelProvider provider()
Возвращает провайдер, создавший этот канал.
Возвращает:
Провайдер, создавший этот канал

open

public static AsynchronousSocketChannel open(AsynchronousChannelGroup group) throws IOException
Открывает асинхронный сокетный канал.

Новый канал создается вызовом метода openAsynchronousSocketChannel у AsynchronousChannelProvider, создавшего группу. Если параметр группы равен null, результирующий канал создается системным провайдером по умолчанию и привязывается к группе по умолчанию.

Параметры:
group — Группа, к которой должен быть привязан вновь созданный канал, или null для группы по умолчанию
Возвращает:
Новый асинхронный сокетный канал
Выбрасывает:
ShutdownChannelGroupException — Если работа группы каналов завершена
IOException — Если произошла ошибка ввода-вывода

open

public static AsynchronousSocketChannel open() throws IOException
Открывает асинхронный сокетный канал.

Этот метод возвращает асинхронный сокетный канал, привязанный к группе по умолчанию. Этот метод эквивалентен вычислению выражения:

    open((AsynchronousChannelGroup)null);
Возвращает:
Новый асинхронный сокетный канал
Выбрасывает:
IOException — Если произошла ошибка ввода-вывода

bind

public abstract AsynchronousSocketChannel bind(SocketAddress local) throws IOException
Описание скопировано из интерфейса: NetworkChannel
Привязывает сокет канала к локальному адресу.

Этот метод устанавливает связь между сокетом и локальным адресом. После установки связи сокет остается привязанным до закрытия канала. Если параметр local имеет значение null, сокет будет привязан к адресу, назначенному автоматически.

Определено в:
bind в интерфейсе NetworkChannel
Параметры:
local — Адрес, к которому нужно привязать сокет, или null, чтобы привязать сокет к автоматически назначенному адресу сокета
Возвращает:
Этот канал
Выбрасывает:
ConnectionPendingException — Если в этом канале уже выполняется операция подключения
AlreadyBoundException — Если сокет уже привязан
UnsupportedAddressTypeException — Если тип указанного адреса не поддерживается
ClosedChannelException — Если канал закрыт
IOException — Если произошла другая ошибка ввода-вывода
См. также:
  • NetworkChannel.getLocalAddress()

setOption

public abstract <T> AsynchronousSocketChannel setOption(SocketOption<T> name, T value) throws IOException
Описание скопировано из интерфейса: NetworkChannel
Устанавливает значение параметра сокета.
Определено в:
setOption в интерфейсе NetworkChannel
Параметры типа:
T — Тип значения параметра сокета
Параметры:
name — Параметр сокета
value — Значение параметра сокета. Значение null может быть допустимым для некоторых параметров сокета.
Возвращает:
Этот канал
Выбрасывает:
IllegalArgumentException — Если значение недопустимо для этого параметра сокета
ClosedChannelException — Если этот канал закрыт
IOException — Если произошла ошибка ввода-вывода
См. также:
  • StandardSocketOptions

shutdownInput

public abstract AsynchronousSocketChannel shutdownInput() throws IOException
Завершает чтение из соединения, не закрывая канал.

После завершения чтения последующие операции чтения из канала будут возвращать -1 — признак конца потока. Если входящая сторона соединения уже отключена, вызов этого метода не оказывает никакого эффекта. Влияние на незавершенную операцию чтения зависит от системы и поэтому не определено. Эффект, если он имеется, при наличии непрочитанных данных в буфере приема сокета или при последующем поступлении данных также зависит от системы.

Возвращает:
Канал
Выбрасывает:
NotYetConnectedException — Если это соединение канала еще не установлено
ClosedChannelException — Если этот канал закрыт
IOException — Если произошла другая ошибка ввода-вывода

shutdownOutput

public abstract AsynchronousSocketChannel shutdownOutput() throws IOException
Завершает запись в соединение, не закрывая канал.

После завершения записи дальнейшие попытки записи в канал будут приводить к выбросу ClosedChannelException. Если исходящая сторона соединения уже отключена, вызов этого метода не оказывает никакого эффекта. Влияние на незавершенную операцию записи зависит от системы и поэтому не определено.

Возвращает:
Канал
Выбрасывает:
NotYetConnectedException — Если это соединение канала еще не установлено
ClosedChannelException — Если этот канал закрыт
IOException — Если произошла другая ошибка ввода-вывода

getRemoteAddress

public abstract SocketAddress getRemoteAddress() throws IOException
Возвращает удаленный адрес, к которому подключен сокет этого канала.

Если канал привязан и подключен к сокету с адресом интернет-протокола, возвращаемое этим методом значение имеет тип InetSocketAddress.

Возвращает:
Удаленный адрес; null, если сокет канала не подключен
Выбрасывает:
ClosedChannelException — Если канал закрыт
IOException — Если произошла ошибка ввода-вывода

connect

public abstract <A> void connect(SocketAddress remote, A attachment, CompletionHandler<Void, ? super A> handler)
Подключает этот канал.

Этот метод инициирует операцию подключения канала. Параметр handler — это обработчик завершения, вызываемый после успешного установления соединения или в случае, когда соединение установить не удалось. Если соединение установить не удается, канал закрывается.

Параметры типа:
A — Тип прикрепленного объекта
Параметры:
remote — Удаленный адрес, к которому нужно подключить этот канал
attachment — Объект, прикрепляемый к операции ввода-вывода; может быть null
handler — Обработчик для получения результата
Выбрасывает:
UnresolvedAddressException — Если указанный удаленный адрес разрешен не полностью
UnsupportedAddressTypeException — Если тип указанного удаленного адреса не поддерживается
AlreadyConnectedException — Если этот канал уже подключен
ConnectionPendingException — Если в этом канале уже выполняется операция подключения
ShutdownChannelGroupException — Если работа группы каналов завершена
См. также:
  • getRemoteAddress()

connect

public abstract Future<Void> connect(SocketAddress remote)
Подключает этот канал.

Этот метод инициирует операцию подключения канала. Он работает точно так же, как метод connect(SocketAddress, Object, CompletionHandler), за исключением того, что вместо указания обработчика завершения возвращает Future, представляющий ожидающий результат. Метод get объекта Future возвращает null при успешном завершении.

Параметры:
remote — Удаленный адрес, к которому нужно подключить этот канал
Возвращает:
Объект Future, представляющий ожидающий результат
Выбрасывает:
UnresolvedAddressException — Если указанный удаленный адрес разрешен не полностью
UnsupportedAddressTypeException — Если тип указанного удаленного адреса не поддерживается
AlreadyConnectedException — Если этот канал уже подключен
ConnectionPendingException — Если в этом канале уже выполняется операция подключения

read

public abstract <A> void read(ByteBuffer dst, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer, ? super A> handler)
Считывает последовательность байтов из этого канала в указанный буфер.

Этот метод инициирует асинхронную операцию чтения последовательности байтов из этого канала в указанный буфер. Параметр handler — это обработчик завершения, вызываемый после завершения (или сбоя) операции чтения. Передаваемый обработчику завершения результат — количество считанных байтов или -1, если байты не удалось считать, поскольку канал достиг конца потока.

Если указан тайм-аут и он истекает до завершения операции, операция завершается исключением InterruptedByTimeoutException. Если тайм-аут истек и реализация не может гарантировать, что байты не были или не будут считаны из канала в указанный буфер, дальнейшие попытки чтения из канала приведут к выбросу неспецифицированного исключения времени выполнения.

В остальном этот метод работает так же, как метод AsynchronousByteChannel.read(ByteBuffer,Object,CompletionHandler).

Параметры типа:
A — Тип прикрепленного объекта
Параметры:
dst — Буфер, в который будут переданы байты
timeout — Максимальное время, отведенное на завершение операции ввода-вывода
unit — Единица измерения времени аргумента timeout
attachment — Объект, прикрепляемый к операции ввода-вывода; может быть null
handler — Обработчик для получения результата
Выбрасывает:
IllegalArgumentException — Если буфер доступен только для чтения или является представлением MemorySegment, выделенного из арены с привязкой к потоку
ReadPendingException — Если в этом канале уже выполняется операция чтения
NotYetConnectedException — Если этот канал еще не подключен
ShutdownChannelGroupException — Если работа группы каналов завершена

read

public final <A> void read(ByteBuffer dst, A attachment, CompletionHandler<Integer, ? super A> handler)
Описание скопировано из интерфейса: AsynchronousByteChannel
Считывает последовательность байтов из этого канала в указанный буфер.

Этот метод инициирует асинхронную операцию чтения последовательности байтов из этого канала в указанный буфер. Параметр handler — это обработчик завершения, вызываемый после завершения (или сбоя) операции чтения. Передаваемый обработчику завершения результат — количество считанных байтов или -1, если байты не удалось считать, поскольку канал достиг конца потока.

Операция чтения может считать из канала до r байтов, где r — количество оставшихся в буфере байтов, то есть dst.remaining() на момент попытки чтения. Если r равно 0, операция чтения немедленно завершается с результатом 0, не инициируя операцию ввода-вывода.

Предположим, что считана последовательность байтов длиной n, где 0 < n <= r. Эта последовательность байтов будет записана в буфер так, что первый байт последовательности окажется по индексу p, а последний — по индексу p + n - 1, где p — позиция буфера в момент выполнения чтения. После завершения позиция буфера будет равна p + n; его предел не изменится.

Буферы не предназначены для безопасного использования несколькими параллельными потоками, поэтому не следует обращаться к буферу до завершения операции.

Этот метод можно вызвать в любое время. Некоторые типы каналов не допускают более одной незавершенной операции чтения одновременно. Если поток инициирует операцию чтения до завершения предыдущей операции чтения, будет выброшено исключение ReadPendingException.

Определено в:
read в интерфейсе AsynchronousByteChannel
Параметры типа:
A — Тип прикрепленного объекта
Параметры:
dst — Буфер, в который будут переданы байты
attachment — Объект, прикрепляемый к операции ввода-вывода; может быть null
handler — Обработчик завершения
Выбрасывает:
IllegalArgumentException — Если буфер доступен только для чтения или является представлением MemorySegment, выделенного из арены с привязкой к потоку
ReadPendingException — Если канал не допускает более одной незавершенной операции чтения и предыдущая операция чтения еще не завершена
NotYetConnectedException — Если этот канал еще не подключен
ShutdownChannelGroupException — Если работа группы каналов завершена

read

public abstract Future<Integer> read(ByteBuffer dst)
Описание скопировано из интерфейса: AsynchronousByteChannel
Считывает последовательность байтов из этого канала в указанный буфер.

Этот метод инициирует асинхронную операцию чтения последовательности байтов из этого канала в указанный буфер. Он работает точно так же, как метод read(ByteBuffer,Object,CompletionHandler), за исключением того, что вместо указания обработчика завершения возвращает Future, представляющий ожидающий результат. Метод get объекта Future возвращает количество считанных байтов или -1, если байты не удалось считать, поскольку канал достиг конца потока.

Определено в:
read в интерфейсе AsynchronousByteChannel
Параметры:
dst — Буфер, в который будут переданы байты
Возвращает:
Future, представляющий результат операции
Выбрасывает:
IllegalArgumentException — Если буфер доступен только для чтения или является представлением MemorySegment, выделенного из арены с привязкой к потоку
ReadPendingException — Если канал не допускает более одной незавершенной операции чтения и предыдущая операция чтения еще не завершена
NotYetConnectedException — Если этот канал еще не подключен

read

public abstract <A> void read(ByteBuffer[] dsts, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long, ? super A> handler)
Считывает последовательность байтов из этого канала в подпоследовательность указанных буферов. Эта операция, иногда называемая чтением с распределением, часто полезна при реализации сетевых протоколов, в которых данные группируются в сегменты, состоящие из одного или нескольких заголовков фиксированной длины и следующего за ними тела переменной длины. Параметр handler — это обработчик завершения, вызываемый после завершения (или сбоя) операции чтения. Передаваемый обработчику завершения результат — количество считанных байтов или -1, если байты не удалось считать, поскольку канал достиг конца потока.

Этот метод инициирует чтение из канала до r байтов, где r — общее количество оставшихся байтов в указанной подпоследовательности заданного массива буферов, то есть

    dsts[offset].remaining()
        + dsts[offset+1].remaining()
        + ... + dsts[offset+length-1].remaining()
на момент попытки чтения.

Предположим, что считана последовательность байтов длиной n, где 0 < n <= r. До первых dsts[offset].remaining() байтов этой последовательности будут записаны в буфер dsts[offset], до следующих dsts[offset+1].remaining() байтов — в буфер dsts[offset+1] и так далее, пока вся последовательность байтов не будет записана в указанные буферы. В каждый буфер передается максимально возможное количество байтов, поэтому конечная позиция каждого обновленного буфера, кроме последнего обновленного буфера, гарантированно будет равна пределу этого буфера. Базовая операционная система может ограничивать количество буферов, используемых в операции ввода-вывода. Если количество буферов (с оставшимися байтами) превышает это ограничение, операция ввода-вывода выполняется с максимально разрешенным операционной системой количеством буферов.

Если указан тайм-аут и он истекает до завершения операции, она завершается исключением InterruptedByTimeoutException. Если тайм-аут истек и реализация не может гарантировать, что байты не были или не будут считаны из канала в указанные буферы, дальнейшие попытки чтения из канала приведут к выбросу неспецифицированного исключения времени выполнения.

Параметры типа:
A — Тип прикрепленного объекта
Параметры:
dsts — Буферы, в которые будут переданы байты
offset — Смещение в массиве буферов первого буфера, в который будут переданы байты; должно быть неотрицательным и не превышать dsts.length
length — Максимальное количество буферов для доступа; должно быть неотрицательным и не превышать dsts.length - offset
timeout — Максимальное время, отведенное на завершение операции ввода-вывода
unit — Единица измерения времени аргумента timeout
attachment — Объект, прикрепляемый к операции ввода-вывода; может быть null
handler — Обработчик для получения результата
Выбрасывает:
IndexOutOfBoundsException — Если не выполнены предварительные условия для параметров offset и length
IllegalArgumentException — Если какой-либо буфер доступен только для чтения или является представлением MemorySegment, выделенного из арены с привязкой к потоку
ReadPendingException — Если в этом канале уже выполняется операция чтения
NotYetConnectedException — Если этот канал еще не подключен
ShutdownChannelGroupException — Если работа группы каналов завершена

write

public abstract <A> void write(ByteBuffer src, long timeout, TimeUnit unit, A attachment, CompletionHandler<Integer, ? super A> handler)
Записывает последовательность байтов из указанного буфера в этот канал.

Этот метод инициирует асинхронную операцию записи последовательности байтов из указанного буфера в этот канал. Параметр handler — это обработчик завершения, вызываемый после завершения (или сбоя) операции записи. Передаваемый обработчику завершения результат — количество записанных байтов.

Если указан тайм-аут и он истекает до завершения операции, она завершается исключением InterruptedByTimeoutException. Если тайм-аут истек и реализация не может гарантировать, что байты не были или не будут записаны в канал из указанного буфера, дальнейшие попытки записи в канал приведут к выбросу неспецифицированного исключения времени выполнения.

В остальном этот метод работает так же, как метод AsynchronousByteChannel.write(ByteBuffer,Object,CompletionHandler).

Параметры типа:
A — Тип прикрепленного объекта
Параметры:
src — Буфер, из которого будут получены байты
timeout — Максимальное время, отведенное на завершение операции ввода-вывода
unit — Единица измерения времени аргумента timeout
attachment — Объект, прикрепляемый к операции ввода-вывода; может быть null
handler — Обработчик для получения результата
Выбрасывает:
IllegalArgumentException — Если буфер является представлением MemorySegment, выделенного из арены с привязкой к потоку
WritePendingException — Если в этом канале уже выполняется операция записи
NotYetConnectedException — Если этот канал еще не подключен
ShutdownChannelGroupException — Если работа группы каналов завершена

write

public final <A> void write(ByteBuffer src, A attachment, CompletionHandler<Integer, ? super A> handler)
Описание скопировано из интерфейса: AsynchronousByteChannel
Записывает последовательность байтов из указанного буфера в этот канал.

Этот метод инициирует асинхронную операцию записи последовательности байтов из указанного буфера в этот канал. Параметр handler — это обработчик завершения, вызываемый после завершения (или сбоя) операции записи. Передаваемый обработчику завершения результат — количество записанных байтов.

Операция записи может записать в канал до r байтов, где r — количество оставшихся в буфере байтов, то есть src.remaining() на момент попытки записи. Если r равно 0, операция записи немедленно завершается с результатом 0, не инициируя операцию ввода-вывода.

Предположим, что записана последовательность байтов длиной n, где 0 < n <= r. Эта последовательность байтов будет передана из буфера начиная с индекса p, где p — позиция буфера в момент выполнения записи; индекс последнего записанного байта будет равен p + n - 1. После завершения позиция буфера будет равна p + n; его предел не изменится.

Буферы не предназначены для безопасного использования несколькими параллельными потоками, поэтому не следует обращаться к буферу до завершения операции.

Этот метод можно вызвать в любое время. Некоторые типы каналов не допускают более одной незавершенной операции записи одновременно. Если поток инициирует операцию записи до завершения предыдущей операции записи, будет выброшено исключение WritePendingException.

Определено в:
write в интерфейсе AsynchronousByteChannel
Параметры типа:
A — Тип прикрепленного объекта
Параметры:
src — Буфер, из которого будут получены байты
attachment — Объект, прикрепляемый к операции ввода-вывода; может быть null
handler — Объект-обработчик завершения
Выбрасывает:
IllegalArgumentException — Если буфер является представлением MemorySegment, выделенного из арены с привязкой к потоку
WritePendingException — Если канал не допускает более одной незавершенной операции записи и предыдущая операция записи еще не завершена
NotYetConnectedException — Если этот канал еще не подключен
ShutdownChannelGroupException — Если работа группы каналов завершена

write

public abstract Future<Integer> write(ByteBuffer src)
Описание скопировано из интерфейса: AsynchronousByteChannel
Записывает последовательность байтов в этот канал из указанного буфера.

Этот метод инициирует асинхронную операцию записи последовательности байтов в этот канал из указанного буфера. Метод работает точно так же, как метод write(ByteBuffer,Object,CompletionHandler), за исключением того, что вместо указания обработчика завершения этот метод возвращает Future, представляющий ожидающий результат. Метод get объекта Future возвращает количество записанных байтов.

Определено в:
write в интерфейсе AsynchronousByteChannel
Параметры:
src — буфер, из которого извлекаются байты
Возвращает:
Объект Future, представляющий результат операции
Выбрасывает:
IllegalArgumentException — если буфер является представлением MemorySegment, выделенного из арены с ограничением одним потоком
WritePendingException — если канал не допускает более одной незавершённой операции записи и предыдущая операция записи ещё не завершена
NotYetConnectedException — если это соединение ещё не установлено

write

public abstract <A> void write(ByteBuffer[] srcs, int offset, int length, long timeout, TimeUnit unit, A attachment, CompletionHandler<Long, ? super A> handler)
Записывает последовательность байтов в этот канал из подпоследовательности указанных буферов. Эта операция, иногда называемая записью с рассеиванием, часто полезна при реализации сетевых протоколов, группирующих данные в сегменты, состоящие из одного или нескольких заголовков фиксированной длины, за которыми следует тело переменной длины. Параметр handler — это обработчик завершения, который вызывается при завершении (или сбое) операции записи. Передаваемый обработчику завершения результат — это количество записанных байтов.

Этот метод инициирует запись в этот канал до r байтов, где r — общее количество оставшихся байтов в указанной подпоследовательности заданного массива буферов, то есть

    srcs[offset].remaining()
        + srcs[offset+1].remaining()
        + ... + srcs[offset+length-1].remaining()
на момент попытки записи.

Предположим, что записывается последовательность байтов длиной n, где 0 < n <= r. Первые srcs[offset].remaining() байтов этой последовательности записываются из буфера srcs[offset], следующие srcs[offset+1].remaining() байтов — из буфера srcs[offset+1] и так далее, пока не будет записана вся последовательность байтов. Из каждого буфера записывается максимально возможное количество байтов, поэтому конечная позиция каждого обновлённого буфера, кроме последнего обновлённого буфера, гарантированно равна пределу этого буфера. Операционная система может ограничивать количество буферов, используемых в операции ввода-вывода. Если количество буферов (с оставшимися байтами) превышает это ограничение, операция ввода-вывода выполняется с максимально допустимым операционной системой количеством буферов.

Если задано время ожидания и оно истекает до завершения операции, операция завершается с исключением InterruptedByTimeoutException. Если время ожидания истекло и реализация не может гарантировать, что байты из указанных буферов не были записаны или не будут записаны в канал, последующие попытки записи в канал приведут к выбросу неспецифицированного исключения времени выполнения.

Параметры типа:
A — тип прикреплённого объекта
Параметры:
srcs — буферы, из которых извлекаются байты
offset — смещение в массиве буферов, указывающее на первый буфер, из которого извлекаются байты; должно быть неотрицательным и не превышать srcs.length
length — максимальное количество буферов, к которым будет выполнен доступ; должно быть неотрицательным и не превышать srcs.length - offset
timeout — максимальное время завершения операции ввода-вывода
unit — единица измерения времени для аргумента timeout
attachment — объект, прикрепляемый к операции ввода-вывода; может быть null
handler — обработчик для получения результата
Выбрасывает:
IllegalArgumentException — если какой-либо из буферов является представлением MemorySegment, выделенного из арены с ограничением одним потоком
IndexOutOfBoundsException — если не выполнены предварительные условия для параметров offset и length
WritePendingException — если в этом канале уже выполняется операция записи
NotYetConnectedException — если это соединение ещё не установлено
ShutdownChannelGroupException — если группа каналов завершила работу

getLocalAddress

public abstract SocketAddress getLocalAddress() throws IOException
Возвращает адрес сокета, к которому привязан сокет этого канала.

Если канал привязан с помощью bound к адресу сокета протокола Интернета, возвращаемое этим методом значение имеет тип InetSocketAddress.

Определено в:
getLocalAddress в интерфейсе NetworkChannel
Возвращает:
Объект SocketAddress, к которому привязан сокет; null, если сокет канала не привязан
Выбрасывает:
ClosedChannelException — если канал закрыт
IOException — если произошла ошибка ввода-вывода

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, включая концептуальные обзоры, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API