Spec-Zone.ru › OpenJDK 24

Класс SocketChannel

java.lang.Object
java.nio.channels.spi.AbstractInterruptibleChannel
java.nio.channels.SelectableChannel
java.nio.channels.spi.AbstractSelectableChannel
java.nio.channels.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 Отключить алгоритм Nagle

Каналы сокетов для сокетов доменных сокетов Unix поддерживают:

Параметры сокета
Имя параметра Описание
SO_SNDBUF Размер буфера отправки сокета
SO_RCVBUF Размер буфера приема сокета
SO_LINGER Оставаться на связи при закрытии, если данные присутствуют (только при настройке в блокирующем режиме)

Дополнительные (специфичные для реализации) параметры также могут быть поддерживаемы.

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

Since:
1.4

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

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

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

Модификатор и тип Метод Описание
abstract SocketChannel bind(SocketAddress local)
Привязывает сокет канала к локальному адресу.
abstract boolean connect(SocketAddress remote)
Подключает сокет этого канала.
abstract boolean finishConnect()
Завершает процесс подключения сокета канала.
abstract SocketAddress getLocalAddress()
Возвращает адрес сокета, к которому привязан сокет этого канала.
abstract SocketAddress getRemoteAddress()
Возвращает удалённый адрес, к которому подключён сокет этого канала.
abstract boolean isConnected()
Указывает, подключен ли сетевой сокет этого канала.
abstract boolean isConnectionPending()
Указывает, происходит ли в настоящее время операция подключения на этом канале.
static SocketChannel open()
Открывает сокетный канал для сокета протокола Интернета.
static SocketChannel open(ProtocolFamily family)
Открывает сокетный канал.
static SocketChannel open(SocketAddress remote)
Открывает сокетный канал и подключает его к удалённому адресу.
abstract int read(ByteBuffer dst)
Считывает последовательность байтов из этого канала в заданный буфер.
final long read(ByteBuffer[] dsts)
Считывает последовательность байтов из этого канала в заданные буферы.
abstract long read(ByteBuffer[] dsts, int offset, int length)
Считывает последовательность байтов из этого канала в подпоследовательность заданных буферов.
abstract <T> SocketChannel setOption(SocketOption<T> name, T value)
Устанавливает значение параметра сокета.
abstract SocketChannel shutdownInput()
Останавливает подключение для чтения, не закрывая канал.
abstract SocketChannel shutdownOutput()
Останавливает подключение для записи, не закрывая канал.
abstract Socket socket()
Получает сокет, связанный с этим каналом.
final int validOps()
Возвращает набор операций, идентифицирующий поддерживаемые операции этого канала.
abstract int write(ByteBuffer src)
Записывает последовательность байтов в этот канал из заданного буфера.
final long write(ByteBuffer[] srcs)
Записывает последовательность байтов в этот канал из заданных буферов.
abstract long write(ByteBuffer[] srcs, int offset, int length)
Записывает последовательность байтов в этот канал из подпоследовательности заданных буферов.

Методы, объявленные в классе java.nio.channels.spi.AbstractSelectableChannel

blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register

Методы, объявленные в классе java.nio.channels.SelectableChannel

register

Методы, объявленные в классе java.nio.channels.spi.AbstractInterruptibleChannel

begin, close, end, isOpen

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

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

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

isOpen

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

getOption, supportedOptions

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

SocketChannel

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

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

open

public static SocketChannel open() throws IOException
Открывает сокет-канал для сокета протокола Интернет.

Новый канал создается путем вызова метода openSocketChannel системно-глобального объекта по умолчанию SelectorProvider.

Возвращает:
Новый сокет-канал
Исключения:
IOException - Если произошла ошибка ввода-вывода
См. также:
  • свойство java.net.preferIPv4Stack

open

public static SocketChannel open(ProtocolFamily family) throws IOException
Открывает сокет-канал. Параметр family задает protocol family сокета канала.

Новый канал создается путем вызова метода openSocketChannel(ProtocolFamily) системно-глобального объекта по умолчанию SelectorProvider.

Параметры:
family - Семейство протоколов
Возвращает:
Новый сокет-канал
Исключения:
UnsupportedOperationException - Если заданное семейство протоколов не поддерживается. Например, если параметр задан как StandardProtocolFamily.INET6, но IPv6 не включен в платформе.
IOException - Если произошла ошибка ввода-вывода
С тех пор:
15
См. также:
  • свойство java.net.preferIPv4Stack

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 - Если произошла какая-либо другая ошибка ввода-вывода
См. также:
  • свойство java.net.preferIPv4Stack

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 Domain создает файл, соответствующий пути к файлу в UnixDomainSocketAddress. Этот файл сохраняется после закрытия канала и должен быть удален, прежде чем другой сокет сможет привязаться к тому же имени. Если сокет-канал к сокету Unix Domain неявно привязывается путем подключения без предварительного вызова bind, то его сокет является безымянным без соответствующего файла сокета в файловой системе. Если сокет-канал к сокету Unix Domain неявно привязывается вызовом bind(null), это также приводит к безымянному сокету.
Примечание реализации:
Каждая платформа накладывает специфичные для реализации ограничения на максимальную длину имени сокета Unix Domain. Это ограничение применяется при привязке канала. Максимальная длина обычно близка к и, как правило, не меньше 100 байт.
Параметры:
local - Адрес для привязки сокета, или null для привязки сокета к автоматически назначенному адресу сокета
Возвращает:
Этот канал
Исключения:
ConnectionPendingException - Если уже в процессе выполнения неблокирующая операция подключения на этом канале
AlreadyBoundException - Если сокет уже привязан
UnsupportedAddressTypeException - Если тип заданного адреса не поддерживается
ClosedChannelException - Если канал закрыт
IOException - Если произошла какая-либо другая ошибка ввода-вывода
С тех пор:
1.7
См. также:
  • NetworkChannel.getLocalAddress()

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
См. также:
  • StandardSocketOptions

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 Domain, то возвращаемый адрес является 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 - Если произошла какая-либо другая ошибка ввода-вывода

чтение

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 — если произошла какая-либо другая ошибка ввода-вывода

чтение

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 — если произошла какая-либо другая ошибка ввода-вывода

запись

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 — если произошла какая-либо другая ошибка ввода-вывода

запись

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 — если произошла какая-либо другая ошибка ввода-вывода

запись

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
Возвращает адрес сокета, к которому привязан сокет этого канала.

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

Если канал привязан к адресу сокета доменной Unix-системы, то адрес сокета является UnixDomainSocketAddress.

Specified by:
getLocalAddress в интерфейсе NetworkChannel
Returns:
Адрес, к которому привязан сокет; null, если сокет канала не привязан
Throws:
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.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/nio/channels/SocketChannel.html

Spec-Zone.ru

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