Класс 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 или последовательности буферов для операции ввода-вывода не определено. Буферы следует отбросить или, по крайней мере, нужно позаботиться о том, чтобы к ним не обращаться, пока канал остается открытым. Все методы, принимающие параметры таймаута, обрабатывают значения, меньшие или равные нулю, как значения, означающие, что операция ввода-вывода не имеет таймаута.
- С момента:
- 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) Читает последовательность байтов из этого канала в подпоследовательность заданных буферов. |
<A> void |
read(ByteBuffer dst,
A attachment,
CompletionHandler<Integer,? super A> handler) Читает последовательность байтов из этого канала в указанный буфер. |
abstract <A> void |
read(ByteBuffer dst,
long timeout,
TimeUnit unit,
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) Записывает последовательность байтов в этот канал из подпоследовательности заданных буферов. |
<A> void |
write(ByteBuffer src,
A attachment,
CompletionHandler<Integer,? super A> handler) Записывает последовательность байтов в этот канал из указанного буфера. |
abstract <A> void |
write(ByteBuffer src,
long timeout,
TimeUnit unit,
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. В случае таймаута, если реализация не может гарантировать, что байты не были записаны или не будут записаны в канал из заданных буферов, то дальнейшие попытки записи в канал приведут к сбросу исключения неопределённого типа runtime.
- 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.