Класс ServerSocket
- java.lang.Object
-
- java.net.ServerSocket
- Все реализуемые интерфейсы:
- Closeable, AutoCloseable
- Прямые известные подклассы:
- SSLServerSocket
public class ServerSocket extends Object implements Closeable
Этот класс реализует сокеты сервера. Сокет сервера ожидает запросы по сети. Он выполняет некоторую операцию на основе этого запроса и, возможно, возвращает результат запрашивающему.
Фактическая работа сокета сервера выполняется экземпляром класса SocketImpl. Приложение может изменить фабрику сокетов, создающую реализацию сокета, чтобы настроить себя на создание сокетов, соответствующих локальному брандмауэру.
- С тех пор:
- JDK1.0
- См. также:
-
SocketImpl,setSocketFactory(java.net.SocketImplFactory),ServerSocketChannel
Конструкторы
| Конструктор и описание |
|---|
ServerSocket() Создаёт свободный сокет сервера. |
ServerSocket(int port) Создаёт сокет сервера, привязанный к указанному порту. |
ServerSocket(int port,
int backlog) Создаёт сокет сервера и привязывает его к указанному локальному номеру порта с указанным значением очереди. |
ServerSocket(int port,
int backlog,
InetAddress bindAddr) Создаёт сервер с указанным портом, размером очереди и локальным IP-адресом для привязки. |
Методы
| Модификатор и тип | Метод и описание |
|---|---|
Socket |
accept() Ожидает подключения к этому сокету и принимает его. |
void |
bind(SocketAddress endpoint) Привязывает |
void |
bind(SocketAddress endpoint,
int backlog) Привязывает |
void |
close() Закрывает этот сокет. |
ServerSocketChannel |
getChannel() Возвращает уникальный объект |
InetAddress |
getInetAddress() Возвращает локальный адрес этого сокета сервера. |
int |
getLocalPort() Возвращает номер порта, на котором этот сокет слушает. |
SocketAddress |
getLocalSocketAddress() Возвращает адрес конечной точки, к которой привязан этот сокет. |
int |
getReceiveBufferSize() Получает значение параметра |
boolean |
getReuseAddress() Проверяет, включён ли |
int |
getSoTimeout() Извлекает значение для |
protected void |
implAccept(Socket s) Подклассы ServerSocket используют этот метод для переопределения accept(), чтобы возвращать собственный подкласс сокета. |
boolean |
isBound() Возвращает состояние привязки ServerSocket. |
boolean |
isClosed() Возвращает состояние закрытия ServerSocket. |
void |
setPerformancePreferences(int connectionTime,
int latency,
int bandwidth) Устанавливает предпочтения производительности для этого ServerSocket. |
void |
setReceiveBufferSize(int size) Устанавливает предлагаемое значение по умолчанию для параметра |
void |
setReuseAddress(boolean on) Включает/отключает параметр сокета |
static void |
setSocketFactory(SocketImplFactory fac) Устанавливает фабрику реализации сокета сервера для приложения. |
void |
setSoTimeout(int timeout) Включает/выключает |
String |
toString() Возвращает адрес и порт реализации этого сокета в виде |
Методы, унаследованные от класса java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Конструкторы
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. - См. также:
-
SocketImpl,SocketImplFactory.createSocketImpl(),setSocketFactory(java.net.SocketImplFactory),SecurityManager.checkListen(int)
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. - См. также:
-
SocketImpl,SocketImplFactory.createSocketImpl(),setSocketFactory(java.net.SocketImplFactory),SecurityManager.checkListen(int)
ServerSocket
public ServerSocket(int port,
int backlog,
InetAddress bindAddr)
throws IOException Создаёт сервер с указанным портом, длиной очереди ожидающих подключений и локальным IP-адресом для привязки. Аргумент bindAddr может использоваться на многоадресном хосте для ServerSocket, который будет принимать запросы на подключение только к одному из его адресов. Если bindAddr равен null, то сокет будет принимать подключения к любому/всем локальным адресам. Порт должен быть в диапазоне от 0 до 65535 включительно. Значение порта 0 означает, что номер порта автоматически выделяется, обычно из диапазона временных портов. Этот номер порта можно получить, вызвав getLocalPort.
Если есть менеджер безопасности, этот метод вызывает его метод checkListen с аргументом port для обеспечения разрешения операции. Это может привести к SecurityException. Аргумент backlog - это запрашиваемая максимальная длина очереди ожидающих подключений к сокету. Точное значение зависит от реализации. В частности, реализация может установить максимальную длину или вообще игнорировать параметр. Предоставленное значение должно быть больше 0. Если оно меньше или равно 0, будет использоваться реализационно-зависимое значение по умолчанию.
- Параметры:
-
port- номер порта или0для использования номера порта, автоматически выделенного системой. -
backlog- запрашиваемая максимальная длина очереди входящих подключений. -
bindAddr- локальный InetAddress, к которому будет привязан сервер - Исключения:
-
SecurityException- если менеджер безопасности существует и его методcheckListenне разрешает операцию. -
IOException- если при открытии сокета произошла ошибка ввода-вывода. -
IllegalArgumentException- если параметр порта находится вне указанного диапазона допустимых значений портов, который включает от 0 до 65535. - C момента:
- JDK1.1
- См. также:
-
SocketOptions,SocketImpl,SecurityManager.checkListen(int)
Методы
bind
public void bind(SocketAddress endpoint)
throws IOException Привязывает ServerSocket к конкретному адресу (IP-адрес и номер порта).
Если адрес null, система выберет временный порт и допустимый локальный адрес для привязки сокета.
- Параметры:
-
endpoint- IP-адрес и номер порта для привязки. - Исключения:
-
IOException- если операция привязки завершилась неудачей или сокет уже привязан. -
SecurityException- если присутствует менеджер безопасности и его методSecurityManagerне разрешает операцию. -
IllegalArgumentException- если тип SocketAddress не поддерживается данным сокетом - C момента:
- 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 не поддерживается данным сокетом - C момента:
- 1.4
getInetAddress
public InetAddress getInetAddress()
Возвращает локальный адрес этого сокета сервера.
Если сокет был привязан до его закрытия closed, этот метод по-прежнему будет возвращать локальный адрес после закрытия сокета.
Если установлен менеджер безопасности, его метод checkConnect вызывается с локальным адресом и -1 в качестве аргументов для проверки разрешения операции. Если операция не разрешена, возвращается адрес loopback.
- Возвращает:
- адрес, к которому привязан этот сокет, или адрес обратной петли, если доступ к нему заблокирован менеджером безопасности, или
nullесли сокет не привязан. - См. также:
SecurityManager.checkConnect(java.lang.String, int)
getLocalPort
public int getLocalPort()
Возвращает номер порта, на котором прослушивает этот сокет.
Если сокет был привязан до его закрытия closed, этот метод по-прежнему будет возвращать номер порта после закрытия сокета.
- Возвращает:
- номер порта, на котором прослушивает этот сокет, или -1, если сокет ещё не привязан.
getLocalSocketAddress
public SocketAddress getLocalSocketAddress()
Возвращает адрес конечной точки, к которой привязан этот сокет.
Если сокет был привязан до его закрытия closed, этот метод по-прежнему будет возвращать адрес конечной точки после закрытия сокета.
Если установлен менеджер безопасности, его метод checkConnect вызывается с локальным адресом и -1 в качестве аргументов для проверки разрешения операции. Если операция не разрешена, возвращается SocketAddress представляющий адрес loopback и локальный порт, к которому привязан сокет.
- Возвращает:
- объект
SocketAddress, представляющий локальный конечный пункт этого сокета, или объектSocketAddress, представляющий адрес обратной петли, если доступ запрещён менеджером безопасности, илиnull, если сокет ещё не привязан. - С:
- 1.4
- См. также:
-
getInetAddress(),getLocalPort(),bind(SocketAddress),SecurityManager.checkConnect(java.lang.String, int)
accept
public Socket accept()
throws IOException Ожидает подключения к этому сокету и принимает его. Метод блокируется до тех пор, пока не будет установлено подключение.
Создается новый сокет s, и если существует менеджер безопасности, вызывается его метод checkAccept с s.getInetAddress().getHostAddress() и s.getPort() в качестве аргументов для проверки разрешения операции. Это может привести к исключению SecurityException.
- Возвращает:
- новый сокет
- Исключения:
-
IOException- если при ожидании подключения возникает ошибка ввода-вывода. -
SecurityException- если менеджер безопасности существует и его методcheckAcceptне разрешает операцию. -
SocketTimeoutException- если ранее был установлен таймаут с помощью setSoTimeout, и таймаут истек. -
IllegalBlockingModeException- если этому сокету связан канал, канал находится в режиме без блокировки, и нет подключения, готового к приёму. - См. также:
SecurityManager.checkAccept(java.lang.String, int)
implAccept
protected final void implAccept(Socket s)
throws IOException Подклассы ServerSocket используют этот метод для переопределения accept(), чтобы возвращать свой собственный подкласс сокета. Например, FooServerSocket обычно передаёт в этот метод пустой FooSocket. После возврата из implAccept сокет FooSocket будет подключен к клиенту.
- Параметры:
-
s- сокет - Исключения:
-
IllegalBlockingModeException- если этому сокету связан канал, и канал находится в режиме без блокировки -
IOException- если при ожидании подключения возникает ошибка ввода-вывода. - С:
- JDK1.1
close
public void close()
throws IOException Закрывает этот сокет. Любой поток, заблокированный в accept(), выбросит исключение SocketException.
Если этому сокету связан канал, то канал также закрывается.
- Определено в:
-
closeв интерфейсеCloseable - Определено в:
-
closeв интерфейсеAutoCloseable - Исключения:
-
IOException- если при закрытии сокета возникает ошибка ввода-вывода.
getChannel
public ServerSocketChannel getChannel()
Возвращает уникальный объект ServerSocketChannel, связанный с этим сокетом, если таковой имеется.
У серверного сокета будет канал, только если сам канал был создан с помощью метода ServerSocketChannel.open.
- Возвращает:
- канал серверного сокета, связанный с этим сокетом, или
null, если этот сокет не был создан для канала - С:
- 1.4
isBound
public boolean isBound()
Возвращает состояние привязки ServerSocket.
- Возвращает:
- true, если ServerSocket успешно привязан к адресу
- С:
- 1.4
isClosed
public boolean isClosed()
Возвращает состояние закрытия ServerSocket.
- Возвращает:
- true, если сокет был закрыт
- С:
- 1.4
setSoTimeout
public void setSoTimeout(int timeout)
throws SocketException Включает/отключает SO_TIMEOUT со значением указанного таймаута в миллисекундах. Если этот параметр установлен с ненулевым таймаутом, вызов accept() для этого ServerSocket будет блокироваться только в течение этого времени. Если таймаут истечёт, возникает исключение java.net.SocketTimeoutException, но ServerSocket остаётся валидным. Параметр обязательно должен быть включён до начала блокирующей операции, чтобы иметь эффект. Таймаут должен быть > 0 . Таймаут 0 интерпретируется как бесконечный таймаут.
- Параметры:
-
timeout- указанный таймаут в миллисекундах - Исключения:
-
SocketException- если возникает ошибка в базовом протоколе, например, TCP ошибка. - С:
- JDK1.1
- См. также:
getSoTimeout()
getSoTimeout
public int getSoTimeout()
throws IOException Получить значение параметра SO_TIMEOUT. Значение 0 означает, что параметр отключен (т.е., таймаут бесконечен).
- Возвращает:
- значение
SO_TIMEOUT - Исключения:
-
IOException- если возникает ошибка ввода-вывода - С:
- JDK1.1
- См. также:
setSoTimeout(int)
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(),bind(SocketAddress),isBound(),isClosed()
getReuseAddress
public boolean getReuseAddress()
throws SocketException Проверяет, включена ли опция SO_REUSEADDR.
- Возвращает:
- значение
boolean, указывающее, включена ли опцияSO_REUSEADDR. - Исключения:
-
SocketException- если возникает ошибка в базовом протоколе, например, TCP ошибка. - С:
- 1.4
- См. также:
setReuseAddress(boolean)
toString
public String toString()
Возвращает адрес и порт реализации этого сокета в виде String.
Если установлен менеджер безопасности, вызывается его метод checkConnect с локальным адресом и -1 в качестве аргументов, чтобы проверить разрешение операции. Если операция не разрешена, возвращается объект InetAddress , представляющий адрес loopback.
setSocketFactory
public static void setSocketFactory(SocketImplFactory fac)
throws IOException Устанавливает фабрику реализации серверного сокета для приложения. Фабрику можно указать только один раз.
Когда приложение создаёт новый серверный сокет, вызывается метод фабрики реализации сокета createSocketImpl для создания фактической реализации сокета.
Передача null в метод является пустой операцией, если фабрика ещё не была установлена.
Если существует менеджер безопасности, этот метод сначала вызывает метод менеджера безопасности checkSetFactory для проверки разрешения операции. Это может привести к исключению SecurityException.
- Параметры:
-
fac- желаемая фабрика. - Исключения:
-
IOException- если при установке фабрики сокета возникает ошибка ввода-вывода. -
SocketException- если фабрика уже определена. -
SecurityException- если менеджер безопасности существует и его методcheckSetFactoryне разрешает операцию. - См. также:
-
SocketImplFactory.createSocketImpl(),SecurityManager.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()
getReceiveBufferSize
public int getReceiveBufferSize()
throws SocketException Получает значение параметра SO_RCVBUF для этого ServerSocket, то есть предложенный размер буфера, который будет использован для сокетов, принятых от этого ServerSocket.
Обратите внимание, что фактическое значение, установленное в принятом сокете, определяется вызовом Socket.getReceiveBufferSize().
- Возвращает:
- значение параметра
SO_RCVBUFдля этогоSocket. - Исключения:
-
SocketException- если произошла ошибка в базовом протоколе, например, ошибка TCP. - С тех пор:
- 1.4
- См. также:
setReceiveBufferSize(int)
setPerformancePreferences
public void setPerformancePreferences(int connectionTime,
int latency,
int bandwidth) Устанавливает параметры производительности для данного ServerSocket.
Сокеты по умолчанию используют протокол TCP/IP. Некоторые реализации могут предложить альтернативные протоколы с другими характеристиками производительности, чем TCP/IP. Этот метод позволяет приложению выразить свои предпочтения относительно того, как эти компромиссы должны быть сделаны, когда реализация выбирает из доступных протоколов.
Параметры производительности описываются тремя целыми числами, значения которых указывают на относительную важность короткого времени соединения, низкой задержки и высокой пропускной способности. Абсолютные значения целых чисел не имеют значения; для выбора протокола значения просто сравниваются, причём более высокие значения указывают на более сильные предпочтения. Например, если приложение предпочитает короткое время соединения перед низкой задержкой и высокой пропускной способностью, то оно может вызвать этот метод со значениями (1, 0, 0). Если приложение предпочитает высокую пропускную способность перед низкой задержкой, а низкую задержку перед коротким временем соединения, то оно может вызвать этот метод со значениями (0, 1, 2).
Вызов этого метода после того, как этот сокет был привязан, не повлияет. Это означает, что для использования этой возможности необходимо создать сокет с конструктором без аргументов.
- Параметры:
-
connectionTime- Целое число, выражающее относительную важность короткого времени соединения -
latency- Целое число, выражающее относительную важность низкой задержки -
bandwidth- Целое число, выражающее относительную важность высокой пропускной способности - С тех пор:
- 1.5
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.