Класс 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
Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | AsynchronousSocketChannel(AsynchronousChannelProvider provider) | Инициализирует новый экземпляр этого класса. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
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) | Открывает асинхронный сокет-канал. |
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) | Читает последовательность байтов из этого канала в указанный буфер. |
<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) | Записывает последовательность байтов в этот канал из заданного буфера. |
<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, который создал группу. Если параметр группы равен 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- Если установлен менеджер безопасности и он не разрешает доступ к заданному удалённому конечному узлу
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- Если буфер только для чтения -
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- Если буфер только для чтения -
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- Если буфер только для чтения -
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- Если буфер только для чтения -
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- Обработчик для потребления результата - Исключения:
-
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 и локальный порт сокета канала.
- Specified by:
-
getLocalAddressв интерфейсеNetworkChannel - Returns:
SocketAddressадрес, к которому привязан сокет, илиSocketAddress, представляющий адрес обратной связи, если это запрещено системной защитой, илиnull, если сокет канала не привязан- Throws:
-
ClosedChannelException- Если канал закрыт -
IOException- Если произошла ошибка ввода-вывода
© 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/java.base/java/nio/channels/AsynchronousSocketChannel.html