Класс ServerSocket
- Все реализованные интерфейсы:
-
Closeable,AutoCloseable
- Прямые известные подклассы:
SSLServerSocket
public class ServerSocket extends Object implements Closeable
Фактическая работа сокета сервера выполняется экземпляром класса SocketImpl.
Класс ServerSocket определяет удобные методы для установки и получения нескольких параметров сокета. Этот класс также определяет методы setOption и getOption для установки и запроса параметров сокета. Сокет ServerSocket поддерживает следующие параметры:
Также могут поддерживаться дополнительные (специфичные для реализации) параметры.
Имя параметра Описание SO_RCVBUFРазмер буфера приема сокета SO_REUSEADDRПовторное использование адреса
- С момента:
- 1.0
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
| Создает неустановленный сокет сервера. |
||
| Создаёт сокет сервера, привязанный к указанному порту. |
||
| Создает сокет сервера и привязывает его к указанному локальному номеру порта со значением backlog. |
||
| Создаёт сервер с указанным портом, значением backlog и локальным IP-адресом для привязки. |
||
protected |
Создаёт сокет сервера с заданным пользователем SocketImpl. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
Socket |
accept() |
Ожидает подключения к этому сокету и принимает его. |
void |
bind |
Привязывает ServerSocket к определённому адресу (IP-адресу и номеру порта). |
void |
bind |
Привязывает ServerSocket к определённому адресу (IP-адресу и номеру порта). |
void |
close() |
Закрывает этот сокет. |
ServerSocketChannel |
getChannel() |
Возвращает уникальный объект ServerSocketChannel, связанный с этим сокетом, если таковой имеется. |
InetAddress |
getInetAddress() |
Возвращает локальный адрес этого сокета сервера. |
int |
getLocalPort() |
Возвращает номер порта, на котором слушает этот сокет. |
SocketAddress |
getLocalSocketAddress() |
Возвращает адрес конечной точки, к которой привязан этот сокет. |
<T> T |
getOption |
Возвращает значение параметра сокета. |
int |
getReceiveBufferSize() |
Получает значение параметра SO_RCVBUF для этого ServerSocket, то есть предлагаемый размер буфера, который будет использоваться для Sockets, принятых от этого ServerSocket. |
boolean |
getReuseAddress() |
Проверяет, включён ли параметр SO_REUSEADDR. |
int |
getSoTimeout() |
Получить значение для SO_TIMEOUT. 0 возвращает, если параметр отключён (т.е. таймаут бесконечен). |
protected final void |
implAccept |
Подклассы ServerSocket используют этот метод для переопределения accept(), чтобы вернуть свой собственный подкласс сокета. |
boolean |
isBound() |
Возвращает состояние привязки ServerSocket. |
boolean |
isClosed() |
Возвращает состояние закрытия ServerSocket. |
<T> ServerSocket |
setOption |
Устанавливает значение параметра сокета. |
void |
setPerformancePreferences |
Устанавливает предпочтения производительности для этого ServerSocket. |
void |
setReceiveBufferSize |
Устанавливает значение по умолчанию для параметра SO_RCVBUF для сокетов, принятых от этого ServerSocket. |
void |
setReuseAddress |
Включает/отключает параметр сокета SO_REUSEADDR. |
static void |
setSocketFactory |
Устарело. |
void |
setSoTimeout |
Включает/выключает SO_TIMEOUT с указанным таймаутом в миллисекундах. |
Set |
supportedOptions() |
Возвращает набор параметров сокета, поддерживаемых этим сокетом сервера. |
String |
toString() |
Возвращает адрес реализации и порт реализации этого сокета в виде String. |
Подробное описание конструкторов
ServerSocket
protected ServerSocket(SocketImpl impl)
SocketImpl. - Параметры:
-
impl- экземпляр SocketImpl, который нужно использовать для ServerSocket. - Исключения:
-
NullPointerException- если implnull. -
SecurityException- если установлен менеджер безопасности и его методcheckPermissionне разрешаетNetPermission("setSocketImpl"). - С тех пор:
- 12
ServerSocket
public ServerSocket() throws IOException
- Исключения:
-
IOException- ошибка ввода-вывода при открытии сокета.
ServerSocket
public ServerSocket(int port) throws IOException
0 означает, что номер порта будет автоматически назначен, обычно из диапазона временных портов. Этот номер порта можно затем получить, вызвав getLocalPort. Максимальная длина очереди для входящих соединений (запрос на подключение) установлена в 50. Если входящее соединение поступает, когда очередь заполнена, соединение отклоняется.
Если приложение указало фабрику реализации сокета сервера, метод createSocketImpl этой фабрики вызывается для создания фактической реализации сокета. В противном случае создаётся реализация сокета по умолчанию.
Если существует менеджер безопасности, его метод checkListen вызывается с аргументом port для обеспечения разрешения операции. Это может привести к исключению SecurityException.
- Параметры:
-
port- номер порта или0для использования автоматически назначенного номера порта. - Исключения:
-
IOException- если возникает ошибка ввода-вывода при открытии сокета. -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IllegalArgumentException- если параметр порта находится за пределами указанного диапазона допустимых значений порта, который находится между 0 и 65535 включительно. - См. также:
ServerSocket
public ServerSocket(int port, int backlog) throws IOException
0 означает, что номер порта будет автоматически назначен, обычно из диапазона временных портов. Этот номер порта можно затем получить, вызвав getLocalPort. Максимальная длина очереди для входящих соединений (запрос на подключение) установлена в параметре backlog. Если входящее соединение поступает, когда очередь заполнена, соединение отклоняется.
Если приложение указало фабрику реализации сокета сервера, метод createSocketImpl этой фабрики вызывается для создания фактической реализации сокета. В противном случае создаётся реализация сокета по умолчанию.
Если существует менеджер безопасности, его метод checkListen вызывается с аргументом port для обеспечения разрешения операции. Это может привести к исключению SecurityException. Параметр backlog - это запрашиваемая максимальная длина очереди ожидающих подключений к сокету. Его точное значение зависит от реализации. В частности, реализация может установить максимальную длину или вообще игнорировать параметр. Предоставленное значение должно быть больше 0. Если оно меньше или равно 0, будет использоваться реализационный по умолчанию.
- Параметры:
-
port- номер порта или0для использования автоматически назначенного номера порта. -
backlog- запрашиваемая максимальная длина очереди входящих соединений. - Исключения:
-
IOException- если возникает ошибка ввода-вывода при открытии сокета. -
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IllegalArgumentException- если параметр порта находится за пределами указанного диапазона допустимых значений порта, который находится между 0 и 65535 включительно. - См. также:
ServerSocket
public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException
0 означает, что номер порта будет автоматически назначен, обычно из диапазона временных портов. Этот номер порта можно затем получить, вызвав getLocalPort. Если существует менеджер безопасности, этот метод вызывает его метод checkListen с аргументом port для обеспечения разрешения операции. Это может привести к исключению SecurityException. Параметр backlog - это запрашиваемая максимальная длина очереди ожидающих подключений к сокету. Его точное значение зависит от реализации. В частности, реализация может установить максимальную длину или вообще игнорировать параметр. Предоставленное значение должно быть больше 0. Если оно меньше или равно 0, будет использоваться реализационный по умолчанию.
- Параметры:
-
port- номер порта или0для использования автоматически назначенного номера порта. -
backlog- запрашиваемая максимальная длина очереди входящих соединений. -
bindAddr- локальный адрес InetAddress, к которому будет привязан сервер - Исключения:
-
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IOException- если возникает ошибка ввода-вывода при открытии сокета. -
IllegalArgumentException- если параметр порта находится за пределами указанного диапазона допустимых значений порта, который находится между 0 и 65535 включительно. - С тех пор:
- 1.1
- См. также:
Подробное описание методов
bind
public void bind(SocketAddress endpoint) throws IOException
ServerSocket к определённому адресу (IP-адрес и номер порта). Если адрес null, система выберет временный порт и допустимый локальный адрес для привязки сокета.
- Параметры:
-
endpoint- IP-адрес и номер порта для привязки. - Исключения:
-
IOException- если операция привязки не удалась или сокет уже привязан. -
SecurityException- если менеджер безопасности существует и его методSecurityManagerне разрешает операцию. -
IllegalArgumentException- если класс SocketAddress не поддерживается данным сокетом - С тех пор:
- 1.4
bind
public void bind(SocketAddress endpoint, int backlog) throws IOException
ServerSocket к определённому адресу (IP-адрес и номер порта). Если адрес null, система выберет временный порт и допустимый локальный адрес для привязки сокета.
Параметр backlog - это запрашиваемая максимальная длина очереди ожидающих подключений к сокету. Его точное значение зависит от реализации. В частности, реализация может установить максимальную длину или вообще игнорировать параметр. Предоставленное значение должно быть больше 0. Если оно меньше или равно 0, будет использоваться реализационный по умолчанию.
- Параметры:
-
endpoint- IP-адрес и номер порта для привязки. -
backlog- запрашиваемая максимальная длина очереди входящих соединений. - Исключения:
-
IOException- если операция привязки не удалась или сокет уже привязан. -
SecurityException- если менеджер безопасности существует и его методSecurityManagerне разрешает операцию. -
IllegalArgumentException- если класс SocketAddress не поддерживается данным сокетом - С тех пор:
- 1.4
getInetAddress
public InetAddress getInetAddress()
Если сокет был привязан до вызова closed, этот метод продолжит возвращать локальный адрес после закрытия сокета.
Если установлен менеджер безопасности, его метод checkConnect вызывается с локальным адресом и -1 в качестве аргументов, чтобы проверить разрешение операции. Если операция не разрешена, возвращается адрес loopback.
- Возвращает:
- адрес, к которому привязан этот сокет, или адрес loopback, если запрещено менеджером безопасности, или
nullесли сокет не привязан. - См. также:
getLocalPort
public int getLocalPort()
Если сокет был связан до вызова closed, то этот метод продолжит возвращать номер порта после закрытия сокета.
- Возвращает:
- номер порта, на котором этот сокет прослушивает, или -1, если сокет ещё не связан.
getLocalSocketAddress
public SocketAddress getLocalSocketAddress()
Если сокет был связан до вызова closed, то этот метод продолжит возвращать адрес конечной точки после закрытия сокета.
Если установлен менеджер безопасности, его метод checkConnect вызывается с локальным адресом и -1 в качестве аргументов, чтобы проверить, разрешена ли операция. Если операция не разрешена, возвращается SocketAddress , представляющий loopback адрес и локальный порт, к которому привязан сокет.
- Возвращает:
SocketAddress, представляющий локальную конечную точку этого сокета, илиSocketAddress, представляющий адрес обратной петли, если доступ запрещён менеджером безопасности, илиnull, если сокет ещё не связан.- С:
- 1.4
- См. также:
accept
public Socket accept() throws IOException
Этот метод может быть прерван в следующих ситуациях:
- Сокет связан с ассоциированным
ServerSocketChannel. В этом случае прерывание потока, принимающего подключение, закроет базовый канал и вызовет исключениеClosedByInterruptExceptionсо статусом прерывания. - Сокет использует системную реализацию сокета и виртуальный поток принимает подключение. В этом случае прерывание виртуального потока вызовет его пробуждение и закрытие сокета. Затем этот метод выбросит
SocketExceptionсо статусом прерывания.
Создается новый сокет s, и если менеджер безопасности существует, вызывается метод checkAccept менеджера безопасности с s.getInetAddress().getHostAddress() и s.getPort() в качестве аргументов для проверки разрешения операции. Это может привести к исключению SecurityException.
- Примечание реализации:
- Экземпляр этого класса, использующий системную реализацию
SocketImpl, принимает сокеты с реализациейSocketImplтого же типа, независимо от фабрики реализации клиентского сокета, если она была установлена. - Возвращает:
- новый сокет
- Исключение:
-
IOException- если при ожидании подключения происходит ошибка ввода-вывода. -
SecurityException- если существует менеджер безопасности и его методcheckAcceptне разрешает операцию. -
SocketTimeoutException- если ранее был установлен таймаут с setSoTimeout и таймаут истек. -
IllegalBlockingModeException- если у этого сокета есть связанный канал, канал находится в режиме без блокировки и нет подключения, готового к приему. - См. также:
implAccept
protected final void implAccept(Socket s) throws IOException
Поведение этого метода не определено, если он вызывается с сокетом, который не был создан и не был связан. Любые параметры сокета, установленные в заданном сокете до вызова этого метода, могут быть сохранены, а могут и не быть сохранены при приёме соединения. Возможно, не удастся принять соединение, когда у этого сокета SocketImpl одного типа, а у заданного сокета SocketImpl совершенно другого типа.
- Примечание реализации:
- Экземпляр этого класса, использующий системную реализацию
SocketImpl, может принять соединение с сокетом Socket, использующим реализациюSocketImplтого же типа:IOExceptionвыбрасывается, если Socket использует пользовательскую реализациюSocketImpl. Экземпляр этого класса, использующий пользовательскую реализациюSocketImpl, не может принять соединение с сокетом Socket, использующим системную реализациюSocketImpl. - Параметры:
-
s- сокет - Исключение:
-
IllegalBlockingModeException- если у этого сокета есть связанный канал, и канал находится в режиме без блокировки. -
IOException- если при ожидании подключения происходит ошибка ввода-вывода, или если этот сокет не может принять соединение с данным сокетом. - С:
- 1.1
close
public void close() throws IOException
accept(), выбросит исключение SocketException. Если у этого сокета есть связанный канал, то канал также закрывается.
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеCloseable - Исключение:
-
IOException- если при закрытии сокета происходит ошибка ввода-вывода.
getChannel
public ServerSocketChannel getChannel()
ServerSocketChannel, связанный с этим сокетом, если таковой есть. Серверный сокет будет иметь канал только в том случае, если сам канал был создан методом ServerSocketChannel.open.
- Возвращает:
- серверный канал сокета, связанный с этим сокетом, или
null, если этот сокет не был создан для канала. - С:
- 1.4
isBound
public boolean isBound()
Если сокет был связан до закрытия, этот метод продолжит возвращать true после закрытия сокета.
- Возвращает:
- true, если ServerSocket успешно привязан к адресу
- С:
- 1.4
isClosed
public boolean isClosed()
- Возвращает:
- true, если сокет был закрыт
- С:
- 1.4
setSoTimeout
public void setSoTimeout(int timeout) throws SocketException
SO_TIMEOUT с заданным таймаутом в миллисекундах. При положительном значении таймаута вызов accept() для этого ServerSocket будет блокироваться только на это время. Если таймаут истечёт, генерируется исключение java.net.SocketTimeoutException, хотя ServerSocket всё ещё валиден. Таймаут 0 интерпретируется как бесконечный таймаут. Параметр должен быть включён перед входом в блокирующую операцию, чтобы иметь эффект.- Параметры:
-
timeout- заданный таймаут в миллисекундах - Исключение:
-
SocketException- если возникает ошибка в базовом протоколе, например, ошибка TCP. -
IllegalArgumentException- еслиtimeoutотрицательно. - С:
- 1.1
- См. также:
getSoTimeout
public int getSoTimeout() throws IOException
SO_TIMEOUT. 0 означает, что параметр отключен (т.е., таймаут бесконечен).- Возвращает:
- значение
SO_TIMEOUT - Исключение:
-
IOException- если возникает ошибка ввода-вывода. - С:
- 1.1
- См. также:
setReuseAddress
public void setReuseAddress(boolean on) throws SocketException
SO_REUSEADDR. После закрытия TCP-соединения соединение может оставаться в состоянии таймаута в течение некоторого времени после закрытия соединения (обычно это состояние TIME_WAIT или состояние ожидания 2MSL). Для приложений, использующих известный адрес сокета или порт, может быть невозможно привязать сокет к нужному SocketAddress если существует соединение в состоянии таймаута, связанное с адресом сокета или портом.
Включение SO_REUSEADDR перед привязкой сокета с помощью bind(SocketAddress) позволяет привязать сокет даже если предыдущее соединение находится в состоянии таймаута.
При создании ServerSocket начальное значение SO_REUSEADDR не определено. Приложения могут использовать getReuseAddress() для определения начального значения SO_REUSEADDR.
Поведение при включении или выключении SO_REUSEADDR после привязки сокета (см. isBound()) не определено.
- Parameters:
-
on- нужно ли включить или выключить опцию сокета - Throws:
-
SocketException- если произошла ошибка при включении или выключении опции сокетаSO_REUSEADDRили сокет закрыт. - Since:
- 1.4
- See Also:
getReuseAddress
public boolean getReuseAddress() throws SocketException
SO_REUSEADDR.- Returns:
- значение
boolean, указывающее, включена лиSO_REUSEADDR. - Throws:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - Since:
- 1.4
- See Also:
toString
public String toString()
String. Если установлен менеджер безопасности и этот сокет привязан, вызывается метод checkConnect менеджера с локальным адресом и -1 в качестве аргументов, чтобы проверить, разрешена ли операция. Если операция не разрешена, в качестве адреса реализации возвращается строка, представляющая loopback-адрес.
- Overrides:
-
toStringв классеObject - Returns:
- строковое представление этого сокета.
setSocketFactory
@Deprecated(since="17") public static void setSocketFactory(SocketImplFactory fac) throws IOException
ServerSocketFactory и подкласс ServerSocket напрямую. Этот метод в ранних версиях JDK предоставлял способ замены системной реализации
ServerSocket. Он в основном устарел с Java 1.4. Если требуется, можно создать ServerSocket для использования пользовательской реализации, расширив ServerSocket и используя защищённый конструктор, принимающий реализацию в качестве параметра.Когда приложение создаёт новый серверный сокет, вызывается метод createSocketImpl фабрики реализации сокетов для создания фактической реализации сокета.
Передача null в метод — это пустая операция, если фабрика ещё не была установлена.
Если установлен менеджер безопасности, этот метод сначала вызывает метод checkSetFactory менеджера безопасности, чтобы убедиться, что операция разрешена. Это может привести к SecurityException.
- Parameters:
-
fac- необходимая фабрика. - Throws:
-
IOException- если при установке фабрики сокета произошла ошибка ввода-вывода. -
SocketException- если фабрика уже определена. -
SecurityException- если существует менеджер безопасности и его методcheckSetFactoryне разрешает операцию. - See Also:
setReceiveBufferSize
public void setReceiveBufferSize(int size) throws SocketException
SO_RCVBUF для сокетов, принятых от этого ServerSocket. Фактическое значение, установленное в принятом сокете, должно определяться вызовом Socket.getReceiveBufferSize() после возвращения сокета методом accept(). Значение SO_RCVBUF используется как для установки размера внутреннего буфера приема сокета, так и для установки размера TCP-окна приема, которое рекламируется удалённому узлу.
Можно изменить это значение впоследствии, вызвав Socket.setReceiveBufferSize(int). Однако, если приложение хочет разрешить окно приема больше 64КБ, как определено в RFC1323, то предложенное значение должно быть установлено в ServerSocket до привязки к локальному адресу. Это подразумевает, что ServerSocket должен быть создан с конструктором без аргументов, затем вызван setReceiveBufferSize(), а затем ServerSocket привязывается к адресу с помощью bind().
Отказ от этого не вызовет ошибки, и размер буфера может быть установлен в запрошенное значение, но размер TCP-окна приема в сокетах, принятых от этого ServerSocket, не будет больше 64КБ.
- Parameters:
-
size- размер, на который нужно установить размер буфера приема. Это значение должно быть больше 0. - Throws:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. -
IllegalArgumentException- если значение равно 0 или отрицательно. - Since:
- 1.4
- See Also:
getReceiveBufferSize
public int getReceiveBufferSize() throws SocketException
SO_RCVBUF для этого ServerSocket, то есть предлагаемый размер буфера, который будет использоваться для сокетов, принятых от этого ServerSocket. Обратите внимание, что фактическое значение, установленное в принятом сокете, определяется вызовом Socket.getReceiveBufferSize().
- Returns:
- значение опции
SO_RCVBUFдля этогоSocket. - Throws:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - Since:
- 1.4
- See Also:
setPerformancePreferences
public void setPerformancePreferences(int connectionTime, int latency, int bandwidth)
Сокеты по умолчанию используют протокол TCP/IP. Некоторые реализации могут предложить альтернативные протоколы, которые имеют разные характеристики производительности по сравнению с TCP/IP. Этот метод позволяет приложению выразить свои предпочтения относительно того, как следует рассматривать эти компромиссы, когда реализация выбирает из доступных протоколов.
Предпочтения производительности описываются тремя целыми числами, значения которых указывают на относительную важность короткого времени подключения, низкой задержки и высокой пропускной способности. Абсолютные значения целых чисел несущественны; для выбора протокола значения просто сравниваются, причём большие значения указывают на более сильные предпочтения. Например, если приложение предпочитает короткое время подключения по сравнению с низкой задержкой и высокой пропускной способностью, то оно может вызвать этот метод со значениями (1, 0, 0). Если приложение предпочитает высокую пропускную способность выше низкой задержки, а низкую задержку выше короткого времени подключения, то оно может вызвать этот метод со значениями (0, 1, 2).
Вызов этого метода после привязки этого сокета не повлияет на результат. Это означает, что для использования этой возможности сокет должен быть создан с конструктором без аргументов.
- Parameters:
-
connectionTime- Целое число, отражающее относительную важность короткого времени подключения -
latency- Целое число, отражающее относительную важность низкой задержки -
bandwidth- Целое число, отражающее относительную важность высокой пропускной способности - Since:
- 1.5
setOption
public <T> ServerSocket setOption(SocketOption<T> name, T value) throws IOException
- Type Parameters:
-
T- Тип значения параметра сокета - Parameters:
-
name- Параметр сокета -
value- Значение параметра сокета. Значениеnullможет быть допустимым для некоторых параметров. - Returns:
- this ServerSocket
- Throws:
-
UnsupportedOperationException- если серверный сокет не поддерживает параметр. -
IllegalArgumentException- если значение не является допустимым для параметра. -
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
NullPointerException- если имя являетсяnull -
SecurityException- если установлен менеджер безопасности, и параметр сокета требует разрешения безопасности, и вызывающий его не обладает требуемым разрешением.StandardSocketOptionsне требуют разрешения безопасности. - Since:
- 9
getOption
public <T> T getOption(SocketOption<T> name) throws IOException
- Type Parameters:
-
T- Тип значения параметра сокета - Parameters:
-
name- Параметр сокета - Returns:
- Значение параметра сокета.
- Throws:
-
UnsupportedOperationException- если серверный сокет не поддерживает параметр. -
IOException- если произошла ошибка ввода-вывода или сокет закрыт. -
NullPointerException- если имя являетсяnull -
SecurityException- если установлен менеджер безопасности, и параметр сокета требует разрешения безопасности, и вызывающий его не обладает требуемым разрешением.StandardSocketOptionsне требуют разрешения безопасности. - Since:
- 9
supportedOptions
public Set<SocketOption<?>> supportedOptions()
- Returns:
- Набор параметров сокета, поддерживаемых этим сокетом. Этот набор может быть пустым, если SocketImpl сокета нельзя создать.
- Since:
- 9
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/net/ServerSocket.html
ServerSocketFactoryи подклассServerSocketнапрямую.