Класс SocketChannel
- Все реализуемые интерфейсы:
Closeable, AutoCloseable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, NetworkChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel
public abstract class SocketChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel
Сокетный канал создаётся вызовом одного из методов open этого класса. Метод open без аргументов открывает сокетный канал для сокета интернет-протокола. Метод open(ProtocolFamily) используется для открытия сокетного канала для сокета указанного семейства протоколов. Невозможно создать канал для произвольного уже существующего сокета. Вновь созданный сокетный канал открыт, но ещё не подключён. Попытка выполнить операцию ввода-вывода для неподключённого канала приведёт к выбрасыванию исключения NotYetConnectedException. Сокетный канал можно подключить, вызвав его метод connect; после подключения сокетный канал остаётся подключённым до своего закрытия. Определить, подключён ли сокетный канал, можно, вызвав его метод isConnected.
Сокетные каналы поддерживают неблокирующее подключение: сокетный канал можно создать и инициировать процесс установки соединения с удалённым сокетом с помощью метода connect, чтобы позднее завершить его методом finishConnect. Определить, выполняется ли операция подключения, можно, вызвав метод isConnectionPending.
Сокетные каналы поддерживают асинхронное завершение работы, аналогичное асинхронной операции закрытия, определённой в классе Channel. Если один поток завершает работу входной стороны сокета, пока другой поток заблокирован в операции чтения из канала этого сокета, операция чтения в заблокированном потоке завершится, не прочитав ни одного байта, и вернёт -1. Если один поток завершает работу выходной стороны сокета, пока другой поток заблокирован в операции записи в канал этого сокета, заблокированный поток получит исключение AsynchronousCloseException.
Параметры сокета настраиваются с помощью метода setOption. Сокетные каналы для сокетов интернет-протокола поддерживают следующие параметры:
Имя параметра Описание SO_SNDBUFРазмер буфера отправки сокета SO_RCVBUFРазмер буфера приёма сокета SO_KEEPALIVEПоддержание соединения в активном состоянии SO_REUSEADDRПовторное использование адреса SO_LINGERОжидание при закрытии, если имеются данные (только при блокирующем режиме) TCP_NODELAYОтключение алгоритма Нейгла
Сокетные каналы для доменных сокетов Unix поддерживают:
Имя параметра Описание SO_SNDBUFРазмер буфера отправки сокета SO_RCVBUFРазмер буфера приёма сокета SO_LINGERОжидание при закрытии, если имеются данные (только при блокирующем режиме)
Также могут поддерживаться дополнительные параметры, зависящие от реализации.
Сокетные каналы безопасно использовать из нескольких параллельно работающих потоков. Они поддерживают одновременные чтение и запись, однако в каждый момент времени читать может не более одного потока, а записывать — также не более одного потока. Методы connect и finishConnect взаимно синхронизированы, и попытка начать операцию чтения или записи во время выполнения одного из этих методов будет заблокирована до завершения этого вызова.
- Начиная с версии:
- 1.4
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Инициализирует новый экземпляр этого класса. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract SocketChannel |
bind |
Привязывает сокет канала к локальному адресу. |
abstract boolean |
connect |
Подключает сокет этого канала. |
abstract boolean |
finishConnect() |
Завершает процесс подключения сокетного канала. |
abstract SocketAddress |
getLocalAddress() |
Возвращает адрес сокета, к которому привязан сокет этого канала. |
abstract SocketAddress |
getRemoteAddress() |
Возвращает удалённый адрес, к которому подключён сокет этого канала. |
abstract boolean |
isConnected() |
Показывает, подключён ли сетевой сокет этого канала. |
abstract boolean |
isConnectionPending() |
Показывает, выполняется ли на этом канале операция подключения. |
static SocketChannel |
open() |
Открывает сокетный канал для сокета интернет-протокола. |
static SocketChannel |
open |
Открывает сокетный канал. |
static SocketChannel |
open |
Открывает сокетный канал и подключает его к удалённому адресу. |
abstract int |
read |
Считывает последовательность байтов из этого канала в указанный буфер. |
final long |
read |
Считывает последовательность байтов из этого канала в указанные буферы. |
abstract long |
read |
Считывает последовательность байтов из этого канала в подпоследовательность указанных буферов. |
abstract <T> SocketChannel |
setOption |
Устанавливает значение параметра сокета. |
abstract SocketChannel |
shutdownInput() |
Завершает чтение из соединения, не закрывая канал. |
abstract SocketChannel |
shutdownOutput() |
Завершает запись в соединение, не закрывая канал. |
abstract Socket |
socket() |
Возвращает сокет, связанный с этим каналом. |
final int |
validOps() |
Возвращает набор операций, определяющий операции, поддерживаемые этим каналом. |
abstract int |
write |
Записывает последовательность байтов из указанного буфера в этот канал. |
final long |
write |
Записывает последовательность байтов из указанных буферов в этот канал. |
abstract long |
write |
Записывает последовательность байтов из подпоследовательности указанных буферов в этот канал. |
Методы, объявленные в классе AbstractSelectableChannel
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register | Модификатор и тип | Метод | Описание |
|---|---|---|
final Object |
blockingLock() |
Возвращает объект, на котором синхронизируются методы configureBlocking и register. |
final SelectableChannel |
configureBlocking |
Изменяет режим блокировки этого канала. |
protected final void |
implCloseChannel() |
Закрывает этот канал. |
protected abstract void |
implCloseSelectableChannel() |
Закрывает этот выбираемый канал. |
protected abstract void |
implConfigureBlocking |
Изменяет режим блокировки этого канала. |
final boolean |
isBlocking() |
Показывает, будет ли каждая операция ввода-вывода в этом канале блокироваться до её завершения. |
final boolean |
isRegistered() |
Показывает, зарегистрирован ли этот канал в данный момент хотя бы в одном селекторе. |
final SelectionKey |
keyFor |
Возвращает ключ, представляющий регистрацию канала в указанном селекторе. |
final SelectorProvider |
provider() |
Возвращает поставщика, создавшего этот канал. |
final SelectionKey |
register |
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора. |
Методы, объявленные в классе SelectableChannel
register | Модификатор и тип | Метод | Описание |
|---|---|---|
final SelectionKey |
register |
Регистрирует этот канал в указанном селекторе и возвращает ключ выбора. |
Методы, объявленные в классе AbstractInterruptibleChannel
begin, close, end, isOpen | Модификатор и тип | Метод | Описание |
|---|---|---|
protected final void |
begin() |
Обозначает начало операции ввода-вывода, которая может блокироваться неопределённо долго. |
final void |
close() |
Закрывает этот канал. |
protected final void |
end |
Обозначает окончание операции ввода-вывода, которая может блокироваться неопределённо долго. |
final boolean |
isOpen() |
Показывает, открыт ли этот канал. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Показывает, равен ли этот объект другому объекту. |
protected void |
finalize() |
Устарело, подлежит удалению: этот элемент API будет удалён в будущей версии. Финализация объявлена устаревшей и будет удалена в одном из следующих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения указанного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения указанного промежутка реального времени. |
Методы, объявленные в интерфейсе NetworkChannel
getOption, supportedOptions | Модификатор и тип | Метод | Описание |
|---|---|---|
<T> T |
getOption |
Возвращает значение параметра сокета. |
Set |
supportedOptions() |
Возвращает набор параметров сокета, поддерживаемых этим каналом. |
Подробное описание конструкторов
SocketChannel
protected SocketChannel(SelectorProvider provider)
- Параметры:
-
provider— провайдер, создавший этот канал
Подробное описание методов
open
public static SocketChannel open() throws IOException
Новый канал создается вызовом метода openSocketChannel объекта SelectorProvider, используемого по умолчанию во всей системе.
- Возвращает:
- Новый сокетный канал
- Вызывает исключение:
-
IOException— если возникает ошибка ввода-вывода - См. также:
open
public static SocketChannel open(ProtocolFamily family) throws IOException
family задает protocol family сокета канала. Новый канал создается вызовом метода openSocketChannel(ProtocolFamily) объекта SelectorProvider, используемого по умолчанию во всей системе.
- Параметры:
-
family— семейство протоколов - Возвращает:
- Новый сокетный канал
- Вызывает исключение:
-
UnsupportedOperationException— если указанное семейство протоколов не поддерживается. Например, если параметр задан какStandardProtocolFamily.INET6, но IPv6 на платформе не включен. -
IOException— если возникает ошибка ввода-вывода - Начиная с версии:
- 15
- См. также:
open
public static SocketChannel open(SocketAddress remote) throws IOException
Если удаленный адрес является объектом InetSocketAddress, этот метод действует так, как если бы был вызван метод open(), затем для созданного сокетного канала был вызван метод connect с передачей ему remote, после чего этот канал был возвращен.
Если удаленный адрес является объектом UnixDomainSocketAddress, этот метод действует так, как если бы был вызван метод open(ProtocolFamily) с параметром StandardProtocolFamily.UNIX, затем для созданного сокетного канала был вызван метод connect с передачей ему remote, после чего этот канал был возвращен.
- Параметры:
-
remote— удаленный адрес, к которому должен быть подключен новый канал - Возвращает:
- Новый подключенный сокетный канал
- Вызывает исключение:
-
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции подключения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции подключения, закрывая тем самым канал и устанавливая для текущего потока статус прерывания -
UnresolvedAddressException— если указанный удаленный адрес является объектом InetSocketAddress, который не разрешен полностью -
UnsupportedAddressTypeException— если тип указанного удаленного адреса не поддерживается -
IOException— если возникает другая ошибка ввода-вывода - См. также:
validOps
public final int validOps()
Сокетные каналы поддерживают подключение, чтение и запись, поэтому этот метод возвращает (SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE).
- Определено в:
-
validOpsв классеSelectableChannel - Возвращает:
- Набор допустимых операций
bind
public abstract SocketChannel bind(SocketAddress local) throws IOException
Этот метод устанавливает связь между сокетом и локальным адресом. Для сокетов интернет-протокола установленная связь сохраняется до закрытия канала. Если параметр local имеет значение
null, сокет будет привязан к адресу, назначенному автоматически.
- Определено в:
-
bindв интерфейсеNetworkChannel - Примечание API:
- Привязка сокетного канала к сокету домена Unix создает файл, соответствующий пути к файлу в
UnixDomainSocketAddress. Этот файл сохраняется после закрытия канала, и его необходимо удалить, прежде чем другой сокет сможет привязаться к тому же имени. Если сокетный канал для сокета домена Unix неявно привязан при подключении без предварительного вызова bind, сокет остается безымянным, а в файловой системе не создается соответствующий файл сокета. Если сокетный канал для сокета домена Unix привязывается автоматически вызовомbind(null), сокет также остается безымянным. - Примечание по реализации:
- Для имени сокета домена Unix на каждой платформе действует собственное ограничение на максимальную длину. Это ограничение проверяется при привязке канала. Максимальная длина обычно близка к 100 байтам и, как правило, не меньше этого значения.
- Параметры:
-
local— адрес для привязки сокета илиnull, чтобы привязать сокет к автоматически назначенному адресу - Возвращает:
- Этот канал
- Вызывает исключение:
-
ConnectionPendingException— если для этого канала уже выполняется неблокирующая операция подключения -
AlreadyBoundException— если сокет уже привязан -
UnsupportedAddressTypeException— если тип указанного адреса не поддерживается -
ClosedChannelException— если канал закрыт -
IOException— если возникает другая ошибка ввода-вывода - Начиная с версии:
- 1.7
- См. также:
setOption
public abstract <T> SocketChannel setOption(SocketOption<T> name, T value) throws IOException
NetworkChannel- Определено в:
-
setOptionв интерфейсеNetworkChannel - Параметры типа:
T— тип значения параметра сокета- Параметры:
-
name— параметр сокета -
value— значение параметра сокета. Значениеnullможет быть допустимым для некоторых параметров сокета. - Возвращает:
- Этот канал
- Вызывает исключение:
-
UnsupportedOperationException— если этот канал не поддерживает параметр сокета -
IllegalArgumentException— если значение недопустимо для этого параметра сокета -
ClosedChannelException— если этот канал закрыт -
IOException— если возникает ошибка ввода-вывода - Начиная с версии:
- 1.7
- См. также:
shutdownInput
public abstract SocketChannel shutdownInput() throws IOException
После завершения чтения дальнейшие попытки чтения из канала будут возвращать -1 — признак конца потока. Если входящая сторона соединения уже отключена, вызов этого метода не оказывает никакого эффекта.
- Возвращает:
- Канал
- Вызывает исключение:
-
NotYetConnectedException— если соединение с этим каналом еще не установлено -
ClosedChannelException— если этот канал закрыт -
IOException— если возникает другая ошибка ввода-вывода - Начиная с версии:
- 1.7
shutdownOutput
public abstract SocketChannel shutdownOutput() throws IOException
После завершения записи дальнейшие попытки записи в канал будут вызывать исключение ClosedChannelException. Если исходящая сторона соединения уже отключена, вызов этого метода не оказывает никакого эффекта.
- Возвращает:
- Канал
- Вызывает исключение:
-
NotYetConnectedException— если соединение с этим каналом еще не установлено -
ClosedChannelException— если этот канал закрыт -
IOException— если возникает другая ошибка ввода-вывода - Начиная с версии:
- 1.7
socket
public abstract Socket socket()
- Возвращает:
- Сокет, связанный с этим каналом
- Вызывает исключение:
-
UnsupportedOperationException— если сокет канала не является сокетом интернет-протокола
isConnected
public abstract boolean isConnected()
- Возвращает:
-
true, если и только если сетевой сокет этого каналаopenи подключен
isConnectionPending
public abstract boolean isConnectionPending()
- Возвращает:
-
true, если и только если для этого канала была начата операция подключения, но она еще не завершена вызовом методаfinishConnect
connect
public abstract boolean connect(SocketAddress remote) throws IOException
Если канал работает в неблокирующем режиме, вызов этого метода начинает неблокирующую операцию подключения. Если соединение устанавливается немедленно, что возможно при локальном подключении, этот метод возвращает true. В противном случае метод возвращает false, и операцию подключения необходимо позднее завершить вызовом метода finishConnect.
Если канал работает в блокирующем режиме, вызов этого метода блокируется до установления соединения или возникновения ошибки ввода-вывода.
Этот метод можно вызывать в любое время. Однако если во время его выполнения для этого канала вызывается операция чтения или записи, эта операция сначала будет заблокирована до завершения данного вызова. Если попытка подключения начата, но завершается неудачей, то есть вызов этого метода приводит к проверяемому исключению, канал будет закрыт.
- Параметры:
-
remote— удаленный адрес, к которому должен быть подключен этот канал - Возвращает:
-
true, если соединение установлено;false, если канал работает в неблокирующем режиме и операция подключения выполняется - Вызывает исключение:
-
AlreadyConnectedException— если этот канал уже подключен -
ConnectionPendingException— если для этого канала уже выполняется неблокирующая операция подключения -
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции подключения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции подключения, закрывая тем самым канал и устанавливая для текущего потока статус прерывания -
UnresolvedAddressException— если указанный удаленный адрес является объектом InetSocketAddress, который не разрешен полностью -
UnsupportedAddressTypeException— если тип указанного удаленного адреса не поддерживается -
IOException— если возникает другая ошибка ввода-вывода
finishConnect
public abstract boolean finishConnect() throws IOException
Неблокирующая операция подключения начинается переводом сокетного канала в неблокирующий режим и последующим вызовом его метода connect. После установления соединения или неудачной попытки сокетный канал становится готовым к подключению, и этот метод можно вызвать для завершения последовательности подключения. Если операция подключения завершилась неудачно, вызов этого метода приведет к выбросу соответствующего исключения IOException.
Если этот канал уже подключен, метод не будет блокироваться и немедленно вернет true. Если канал работает в неблокирующем режиме, метод вернет false, если процесс подключения еще не завершен. Если канал работает в блокирующем режиме, метод будет заблокирован до завершения подключения или возникновения ошибки и всегда либо вернет true, либо выбросит проверяемое исключение с описанием ошибки.
Этот метод можно вызывать в любое время. Однако если во время его выполнения для этого канала вызывается операция чтения или записи, эта операция сначала будет заблокирована до завершения данного вызова. Если попытка подключения завершается неудачно, то есть вызов этого метода приводит к проверяемому исключению, канал будет закрыт.
- Возвращает:
-
true, если и только если сокет этого канала теперь подключен - Вызывает исключение:
-
NoConnectionPendingException— если этот канал не подключен и операция подключения не была начата -
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции подключения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции подключения, закрывая тем самым канал и устанавливая для текущего потока статус прерывания -
IOException— если возникает другая ошибка ввода-вывода
getRemoteAddress
public abstract SocketAddress getRemoteAddress() throws IOException
Если сокет канала привязан и подключен к адресу сокета интернет-протокола, возвращаемое значение имеет тип InetSocketAddress.
Если сокет канала привязан и подключен к адресу сокета домена Unix, возвращаемый адрес является объектом UnixDomainSocketAddress.
- Возвращает:
- Удаленный адрес;
null, если сокет канала не подключен - Вызывает исключение:
-
ClosedChannelException— если канал закрыт -
IOException— если возникает ошибка ввода-вывода - Начиная с версии:
- 1.7
read
public abstract int read(ByteBuffer dst) throws IOException
ReadableByteChannel Выполняется попытка считать из канала до r байтов, где r — количество оставшихся в буфере байтов, то есть dst.remaining() на момент вызова этого метода.
Предположим, что считана последовательность байтов длины n, где 0 <= n <= r. Эта последовательность байтов будет перенесена в буфер так, что первый байт последовательности окажется по индексу p, а последний — по индексу p + n - 1, где p — позиция буфера на момент вызова этого метода. После возврата позиция буфера будет равна p + n; его предел не изменится.
Операция чтения может не заполнить буфер и даже не считать ни одного байта. Это зависит от типа и состояния канала. Например, сокетный канал в неблокирующем режиме не может считать больше байтов, чем доступно в данный момент во входном буфере сокета; аналогично, файловый канал не может считать больше байтов, чем осталось в файле. Однако гарантируется, что если канал работает в блокирующем режиме и в буфере остался хотя бы один байт, этот метод будет заблокирован до считывания хотя бы одного байта.
Этот метод можно вызывать в любое время. Однако если другой поток уже начал операцию чтения для этого канала, вызов этого метода будет заблокирован до завершения первой операции.
- Определено в:
-
readв интерфейсеReadableByteChannel - Параметры:
-
dst— буфер, в который будут перенесены байты - Возвращает:
- Количество считанных байтов, возможно ноль, или
-1, если канал достиг конца потока - Вызывает исключение:
-
NotYetConnectedException— если соединение с этим каналом еще не установлено -
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции чтения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции чтения, закрывая тем самым канал и устанавливая для текущего потока статус прерывания -
IOException— если возникает другая ошибка ввода-вывода
read
public abstract long read(ByteBuffer[] dsts, int offset, int length) throws IOException
ScatteringByteChannelПри вызове этого метода выполняется попытка считать из канала до 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] и так далее, пока вся последовательность байтов не будет перенесена в указанные буферы. В каждый буфер переносится максимально возможное количество байтов, поэтому конечная позиция каждого обновленного буфера, кроме последнего обновленного буфера, гарантированно будет равна пределу этого буфера.
Этот метод можно вызывать в любое время. Однако если другой поток уже начал операцию чтения для этого канала, вызов этого метода будет заблокирован до завершения первой операции.
- Определено в:
-
readв интерфейсеScatteringByteChannel - Параметры:
-
dsts— буферы, в которые будут перенесены байты -
offset— смещение в массиве буферов, указывающее на первый буфер, в который будут перенесены байты; должно быть неотрицательным и не превышатьdsts.length -
length— максимальное количество буферов, к которым будет выполнен доступ; должно быть неотрицательным и не превышатьdsts.length—offset - Возвращает:
- Количество считанных байтов, возможно ноль, или
-1, если канал достиг конца потока - Вызывает исключение:
-
NotYetConnectedException— если соединение с этим каналом еще не установлено -
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции чтения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции чтения, закрывая тем самым канал и устанавливая для текущего потока статус прерывания -
IOException— если возникает другая ошибка ввода-вывода
read
public final long read(ByteBuffer[] dsts) throws IOException
ScatteringByteChannel Вызов этого метода в форме c.read(dsts) действует точно так же, как вызов
c.read(dsts, 0, dsts.length);
- Определено в:
-
readв интерфейсеScatteringByteChannel - Параметры:
-
dsts— буферы, в которые будут перенесены байты - Возвращает:
- Количество считанных байтов, возможно ноль, или
-1, если канал достиг конца потока - Вызывает исключение:
-
NotYetConnectedException— если соединение с этим каналом еще не установлено -
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции чтения -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции чтения, закрывая тем самым канал и устанавливая для текущего потока статус прерывания -
IOException— если возникает другая ошибка ввода-вывода
write
public abstract int write(ByteBuffer src) throws IOException
WritableByteChannel Выполняется попытка записать в канал до r байтов, где r — количество оставшихся в буфере байтов, то есть src.remaining() на момент вызова этого метода.
Предположим, что записана последовательность байтов длины n, где 0 <= n <= r. Эта последовательность байтов будет перенесена из буфера, начиная с индекса p, где p — позиция буфера на момент вызова этого метода; индекс последнего записанного байта будет равен p + n - 1. После возврата позиция буфера будет равна p + n; его предел не изменится.
Для многих типов каналов операция записи возвращает управление только после записи всех запрошенных r байтов. Некоторые типы каналов в зависимости от своего состояния могут записать только часть байтов или не записать ни одного. Например, сокетный канал в неблокирующем режиме не может записать больше байтов, чем свободно в выходном буфере сокета. Чтобы записать все оставшиеся байты, может потребоваться вызвать метод записи несколько раз.
Этот метод можно вызывать в любое время. Однако если другой поток уже начал операцию записи для этого канала, вызов этого метода будет заблокирован до завершения первой операции.
- Определено в:
-
writeв интерфейсеWritableByteChannel - Параметры:
-
src— буфер, из которого будут извлечены байты - Возвращает:
- Количество записанных байтов, возможно ноль
- Вызывает исключение:
-
NotYetConnectedException— если соединение с этим каналом еще не установлено -
ClosedChannelException— если этот канал закрыт -
AsynchronousCloseException— если другой поток закрывает этот канал во время выполнения операции записи -
ClosedByInterruptException— если другой поток прерывает текущий поток во время выполнения операции записи, закрывая тем самым канал и устанавливая для текущего потока статус прерывания -
IOException— если возникает другая ошибка ввода-вывода
write
public abstract long write(ByteBuffer[] srcs, int offset, int length) throws IOException
GatheringByteChannelВыполняется попытка записать в этот канал до 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] и так далее, пока вся последовательность байтов не будет записана. Из каждого буфера записывается максимально возможное количество байтов, поэтому конечная позиция каждого изменённого буфера, кроме последнего изменённого буфера, гарантированно будет равна пределу этого буфера.
Для многих типов каналов операция записи возвращает управление только после записи всех r запрошенных байтов. Некоторые типы каналов, в зависимости от своего состояния, могут записать только часть байтов или, возможно, ни одного. Например, сокетный канал в неблокирующем режиме не может записать больше байтов, чем помещается в выходном буфере сокета. Чтобы гарантировать запись всех оставшихся байтов, может потребоваться вызвать метод записи несколько раз.
Этот метод можно вызвать в любой момент. Однако если другой поток уже начал операцию записи в этом канале, вызов этого метода будет заблокирован до завершения первой операции.
- Определено в:
-
writeв интерфейсеGatheringByteChannel - Параметры:
-
srcs- Буферы, из которых извлекаются байты -
offset- Смещение в массиве буферов, указывающее на первый буфер, из которого извлекаются байты; должно быть неотрицательным и не превышатьsrcs.length -
length- Максимальное количество буферов, к которым будет выполнен доступ; должно быть неотрицательным и не превышатьsrcs.length-offset - Возвращает:
- Количество записанных байтов, возможно, ноль
- Исключения:
-
NotYetConnectedException- Если подключение этого канала ещё не установлено -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время выполнения операции записи -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
IOException- Если возникает другая ошибка ввода-вывода
write
public final long write(ByteBuffer[] srcs) throws IOException
GatheringByteChannel Вызов этого метода в форме c.write(srcs) выполняется точно так же, как вызов
c.write(srcs, 0, srcs.length);
- Определено в:
-
writeв интерфейсеGatheringByteChannel - Параметры:
-
srcs- Буферы, из которых извлекаются байты - Возвращает:
- Количество записанных байтов, возможно, ноль
- Исключения:
-
NotYetConnectedException- Если подключение этого канала ещё не установлено -
ClosedChannelException- Если этот канал закрыт -
AsynchronousCloseException- Если другой поток закрывает этот канал во время выполнения операции записи -
ClosedByInterruptException- Если другой поток прерывает текущий поток во время выполнения операции записи, тем самым закрывая канал и устанавливая статус прерывания текущего потока -
IOException- Если возникает другая ошибка ввода-вывода
getLocalAddress
public abstract SocketAddress getLocalAddress() throws IOException
Если канал bound к адресу сокета протокола Интернета, возвращаемое этим методом значение имеет тип InetSocketAddress.
Если канал привязан к адресу сокета домена Unix, адрес сокета имеет тип UnixDomainSocketAddress.
- Определено в:
-
getLocalAddressв интерфейсеNetworkChannel - Возвращает:
SocketAddress, к которому привязан сокет;null, если сокет канала не привязан- Исключения:
-
ClosedChannelException- Если канал закрыт -
IOException- Если возникает ошибка ввода-вывода
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.