Класс ServerSocket
- Все реализованные интерфейсы:
-
Closeable,AutoCloseable
- Прямые известные подклассы:
SSLServerSocket
public class ServerSocket extends Object implements Closeable
Фактическая работа серверного сокета выполняется экземпляром класса SocketImpl.
Класс ServerSocket определяет удобные методы для установки и получения нескольких параметров сокета. Этот класс также определяет методы setOption и getOption для установки и запроса параметров сокета. Серверный сокет поддерживает следующие параметры:
Дополнительные (специфичные для реализации) параметры также могут быть поддерживаемыми.
Имя параметра Описание SO_RCVBUFРазмер буфера приема сокета SO_REUSEADDRПовторное использование адреса
- С:
- 1.0
- См. также:
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
| Создаёт несвязанный серверный сокет. |
||
| Создаёт серверный сокет, связанный со заданным портом. |
||
| Создаёт серверный сокет и связывает его с указанным номером локального порта с заданным значением backlog. |
||
| Создаёт сервер с указанным портом, значением listen 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, то есть предлагаемый размер буфера, который будет использоваться для Сокетов, принятых от этого 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<SocketOption<?>> |
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 адрес и локальный порт, к которому привязан сокет.
- Возвращает:
- a
SocketAddress, представляющий локальную конечную точку этого сокета, илиSocketAddress, представляющий адрес обратной петли, если доступ запрещен менеджером безопасности, илиnull, если сокет еще не привязан. - С момента:
- 1.4
- См. также:
accept
public Socket accept() throws IOException
Создается новый сокет s, и, если установлен менеджер безопасности, вызывается метод менеджера безопасности checkAccept с s.getInetAddress().getHostAddress() и s.getPort() в качестве аргументов, чтобы убедиться в разрешении операции. Это может привести к исключению SecurityException.
- Примечание реализации:
- Экземпляр этого класса, использующий системный
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()) не определено.
- Параметры:
-
on- включать или отключать опцию сокета - Исключение:
-
SocketException- если возникает ошибка при включении или отключении опции сокетаSO_REUSEADDRили сокет закрыт. - С момента:
- 1.4
- См. также:
getReuseAddress
public boolean getReuseAddress() throws SocketException
SO_REUSEADDR.- Возвращает:
- a
boolean, указывающий, включен лиSO_REUSEADDR. - Издает:
-
SocketException- если возникла ошибка в базовом протоколе, например, TCP-ошибка. - С тех пор:
- 1.4
- См. также:
toString
public String toString()
String. Если установлен менеджер безопасности, и этот сокет связан, вызывается его метод checkConnect с локальным адресом и -1 в качестве аргументов, чтобы проверить, разрешена ли операция. Если операция не разрешена, возвращается InetAddress, представляющий loopback адрес в качестве адреса реализации.
- Переопределяет:
-
toStringв классеObject - Возвращает:
- строковое представление этого сокета.
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.
- Параметры:
-
fac- требуемая фабрика. - Издает:
-
IOException- если при установке фабрики сокета возникает ошибка ввода-вывода. -
SocketException- если фабрика уже определена. -
SecurityException- если менеджер безопасности существует, и его методcheckSetFactoryне разрешает операцию. - См. также:
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К байт.
- Параметры:
-
size- размер, на который нужно установить размер буфера приема. Это значение должно быть больше 0. - Издает:
-
SocketException- если возникает ошибка в базовом протоколе, например, TCP-ошибка. -
IllegalArgumentException- если значение равно 0 или отрицательно. - С тех пор:
- 1.4
- См. также:
getReceiveBufferSize
public int getReceiveBufferSize() throws SocketException
SO_RCVBUF для данного ServerSocket, то есть предлагаемый размер буфера, который будет использоваться для сокетов, принятых от данного ServerSocket. Обратите внимание, что фактическое значение, установленное в принятом сокете, определяется вызовом Socket.getReceiveBufferSize().
- Возвращает:
- значение опции
SO_RCVBUFдля этогоSocket. - Издает:
-
SocketException- если возникает ошибка в базовом протоколе, например, TCP-ошибка. - С тех пор:
- 1.4
- См. также:
setPerformancePreferences
public void setPerformancePreferences(int connectionTime, int latency, int bandwidth)
Сокеты по умолчанию используют протокол TCP/IP. Некоторые реализации могут предложить альтернативные протоколы, которые имеют разные характеристики производительности, чем TCP/IP. Этот метод позволяет приложению выразить свои предпочтения относительно того, как следует учитывать эти компромиссы, когда реализация выбирает из доступных протоколов.
Предпочтения производительности описываются тремя целыми числами, значения которых указывают на относительную важность короткого времени подключения, низкой задержки и высокой пропускной способности. Абсолютные значения целых чисел несущественны; для выбора протокола значения просто сравниваются, а большие значения указывают на более сильные предпочтения. Если, например, приложение предпочитает короткое время подключения перед низкой задержкой и высокой пропускной способностью, то оно может вызвать этот метод со значениями (1, 0, 0). Если приложение предпочитает высокую пропускную способность перед низкой задержкой, а низкую задержку перед коротким временем подключения, то оно может вызвать этот метод со значениями (0, 1, 2).
Вызов этого метода после привязки этого сокета не окажет никакого влияния. Это подразумевает, что для использования этой возможности сокет необходимо создать с конструктором без аргументов.
- Параметры:
-
connectionTime- целое число, выражающее относительную важность короткого времени подключения -
latency- целое число, выражающее относительную важность низкой задержки -
bandwidth- целое число, выражающее относительную важность высокой пропускной способности - С тех пор:
- 1.5
setOption
public <T> ServerSocket setOption(SocketOption<T> name, T value) throws IOException
- Тип параметров:
-
T- тип значения опции сокета - Параметры:
-
name- опция сокета -
value- значение опции сокета. Значениеnullможет быть допустимым для некоторых опций. - Возвращает:
- этот ServerSocket
- Издает:
-
UnsupportedOperationException- если серверный сокет не поддерживает опцию. -
IllegalArgumentException- если значение не является допустимым для опции. -
IOException- если возникает ошибка ввода-вывода или сокет закрыт. -
NullPointerException- если имя являетсяnull -
SecurityException- если установлен менеджер безопасности, если опция сокета требует разрешения на безопасность, и если у вызывающего объекта нет требуемого разрешения.StandardSocketOptionsне требуют никакого разрешения на безопасность. - С тех пор:
- 9
getOption
public <T> T getOption(SocketOption<T> name) throws IOException
- Тип параметров:
-
T- тип значения опции сокета - Параметры:
-
name- опция сокета - Возвращает:
- Значение опции сокета.
- Издает:
-
UnsupportedOperationException- если серверный сокет не поддерживает опцию. -
IOException- если возникает ошибка ввода-вывода или сокет закрыт. -
NullPointerException- если имя являетсяnull -
SecurityException- если установлен менеджер безопасности, если опция сокета требует разрешения на безопасность, и если у вызывающего объекта нет требуемого разрешения.StandardSocketOptionsне требуют никакого разрешения на безопасность. - С тех пор:
- 9
supportedOptions
public Set<SocketOption<?>> supportedOptions()
- Возвращает:
- Набор опций сокета, поддерживаемых этим сокетом. Этот набор может быть пустым, если SocketImpl сокета не может быть создан.
- С тех пор:
- 9
© 1993, 2021, 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/17/docs/api/java.base/java/net/ServerSocket.html
ServerSocketFactoryи подклассServerSocketнапрямую.