Spec-Zone.ru › OpenJDK 21

Класс 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 Отключить алгоритм Nagle
Также могут быть поддерживаемы дополнительные параметры (специфичные для реализации).

Таймауты

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

Since:
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)
Записывает последовательность байтов в этот канал из указанного буфера.

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

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

close

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

isOpen

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

getOption, supportedOptions

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

AsynchronousSocketChannel

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

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

provider

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

open

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

Новый канал создаётся путём вызова метода openAsynchronousSocketChannel у AsynchronousChannelProvider, который создал группу. Если параметр group равен 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 - Если произошла другая ошибка ввода-вывода
SecurityException - Если установлен менеджер безопасности и его метод checkListen отклоняет операцию
См. также:
  • 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 — обработчик завершения, который вызывается при успешном подключении или невозможности подключения. Если подключение невозможно, канал закрывается.

Этот метод выполняет точно те же проверки безопасности, что и класс Socket. То есть, если установлен менеджер безопасности, этот метод проверяет, разрешает ли его метод checkConnect подключение к адресу и номеру порта указанного удалённого конечного пункта.

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

connect

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

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

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

чтение

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).

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

чтение

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.

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

чтение

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

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

Specified by:
read в интерфейсе AsynchronousByteChannel
Parameters:
dst - Буфер, в который будут перенесены байты
Returns:
Future, представляющее результат операции
Throws:
IllegalArgumentException - Если буфер только для чтения
ReadPendingException - Если канал не допускает одновременного наличия более одной операции чтения, и предыдущая операция чтения не завершена
NotYetConnectedException - Если этот канал ещё не подключён

чтение

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. В случае таймаута, если реализация не может гарантировать, что байты не были прочитаны или не будут прочитаны из канала в заданные буферы, то дальнейшие попытки чтения из канала приведут к генерации неопределённого исключения времени выполнения.

Type Parameters:
A - Тип привязки
Parameters:
dsts - Буферы, в которые будут перенесены байты
offset - Смещение в массиве буферов первого буфера, в который будут перенесены байты; должно быть неотрицательным и не больше dsts.length
length - Максимальное количество буферов для доступа; должно быть неотрицательным и не больше dsts.length - offset
timeout - Максимальное время для завершения операции ввода-вывода
unit - Единица измерения времени для аргумента timeout
attachment - Объект для привязки к операции ввода-вывода; может быть null
handler - Обработчик для обработки результата
Throws:
IndexOutOfBoundsException - Если условия, предшествующие параметрам offset и length, не выполнены
IllegalArgumentException - Если буфер только для чтения
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).

Type Parameters:
A - Тип прикрепления
Parameters:
src - Буфер, из которого извлекаются байты
timeout - Максимальное время для завершения операции ввода-вывода
unit - Единица измерения времени для аргумента timeout
attachment - Объект, прикрепляемый к операции ввода-вывода; может быть null
handler - Обработчик для обработки результата
Throws:
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.

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

write

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

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

Specified by:
write в интерфейсе AsynchronousByteChannel
Parameters:
src - Буфер, из которого извлекаются байты
Returns:
Future, представляющий результат операции
Throws:
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. В случае таймаута, когда реализация не может гарантировать, что байты не были записаны или не будут записаны в канал из заданных буферов, дальнейшие попытки записи в канал приведут к сбою со неопределённым исключением времени выполнения.

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

getLocalAddress

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

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

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

Указано в:
getLocalAddress в интерфейсе NetworkChannel
Возвращает:
Адрес, к которому привязан сокет, или SocketAddress, представляющий обратный адрес, если доступ запрещён менеджером безопасности, или null если сокет канала не привязан
Исключения:
ClosedChannelException - Если канал закрыт
IOException - Если произошла ошибка ввода-вывода

© 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/java.base/java/nio/channels/AsynchronousSocketChannel.html

Spec-Zone.ru

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