Spec-Zone.ru › OpenJDK 25

Интерфейс WebSocket

public interface WebSocket
Клиент WebSocket.

Экземпляры WebSocket создаются с помощью WebSocket.Builder.

У WebSocket есть входная и выходная стороны. Эти стороны независимы друг от друга. Сторона может быть открыта или закрыта. После закрытия сторона остаётся закрытой. Сообщения WebSocket отправляются через связанный с ним WebSocket и принимаются через связанный с ним WebSocket.Listener. Сообщения можно отправлять, пока выход WebSocket открыт, и принимать, пока открыт вход WebSocket.

Методом отправки является любой из методов sendText, sendBinary, sendPing, sendPong и sendClose интерфейса WebSocket. Метод отправки инициирует операцию отправки и возвращает CompletableFuture, выполнение которого завершается после завершения операции. Если CompletableFuture завершается нормально, операция считается успешной. Если CompletableFuture завершается исключением, операция считается неудачной. Инициированная, но ещё не завершённая операция считается ожидающей.

Методом приёма является любой из методов onText, onBinary, onPing, onPong и onClose интерфейса Listener. WebSocket инициирует операцию приёма, вызывая метод приёма у слушателя. Затем слушатель должен вернуть CompletionStage, выполнение которого завершается после завершения операции.

Для управления приёмом сообщений WebSocket поддерживает внутренний счётчик. Значение этого счётчика показывает, сколько раз WebSocket ещё должен вызвать метод приёма. Пока значение счётчика равно нулю, WebSocket не вызывает методы приёма. Счётчик увеличивается на n при вызове request(n). Счётчик уменьшается на единицу, когда WebSocket вызывает метод приёма. onOpen и onError не являются методами приёма. WebSocket вызывает onOpen перед любыми другими методами слушателя. WebSocket вызывает onOpen не более одного раза. WebSocket может вызвать onError в любой момент. Если WebSocket вызывает onError или onClose, дальнейшие методы слушателя вызываться не будут независимо от значения счётчика. Для только что созданного WebSocket значение счётчика равно нулю.

Если не указано иное, аргументы null приводят к тому, что методы WebSocket выбрасывают NullPointerException; аналогично, WebSocket не передаёт аргументы null методам Listener. Состояние WebSocket не изменяется при вызовах, которые выбрасывают исключение или возвращают CompletableFuture, завершающееся одним из исключений NullPointerException, IllegalArgumentException, IllegalStateException.

WebSocket автоматически обрабатывает полученные сообщения Ping и Close (согласно протоколу WebSocket), отвечая сообщениями Pong и Close. Если слушатель получает сообщения Ping или Close, от него не требуется никаких обязательных действий.

Примечание к API:
Связь между WebSocket и соответствующим ему Listener аналогична связи между Subscription и соответствующим Subscriber типа Flow.
С версии:
11

Краткое описание вложенных классов

Модификатор и тип Интерфейс Описание
static interface  WebSocket.Builder
Построитель клиентов WebSocket.
static interface  WebSocket.Listener
Интерфейс приёма для WebSocket.

Краткое описание полей

Модификатор и тип Поле Описание
static final int NORMAL_CLOSURE
Код состояния сообщения Close WebSocket (1000), обозначающий нормальное закрытие, то есть выполнение цели, ради которой было установлено соединение.

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

Модификатор и тип Метод Описание
void abort()
Резко закрывает вход и выход этого WebSocket.
String getSubprotocol()
Возвращает подпротокол, используемый этим WebSocket.
boolean isInputClosed()
Проверяет, закрыт ли вход этого WebSocket.
boolean isOutputClosed()
Проверяет, закрыт ли выход этого WebSocket.
void request(long n)
Увеличивает счётчик вызовов методов приёма.
CompletableFuture<WebSocket> sendBinary(ByteBuffer data, boolean last)
Отправляет двоичные данные, содержащие байты из указанного буфера.
CompletableFuture<WebSocket> sendClose(int statusCode, String reason)
Инициирует штатное закрытие выходной стороны этого WebSocket, отправляя сообщение Close с указанным кодом состояния и причиной.
CompletableFuture<WebSocket> sendPing(ByteBuffer message)
Отправляет сообщение Ping с байтами из указанного буфера.
CompletableFuture<WebSocket> sendPong(ByteBuffer message)
Отправляет сообщение Pong с байтами из указанного буфера.
CompletableFuture<WebSocket> sendText(CharSequence data, boolean last)
Отправляет текстовые данные с символами из указанной последовательности символов.

Подробное описание полей

NORMAL_CLOSURE

static final int NORMAL_CLOSURE
Код состояния сообщения Close WebSocket (1000), обозначающий нормальное закрытие, то есть выполнение цели, ради которой было установлено соединение.
См. также:
  • sendClose(int, String)
  • WebSocket.Listener.onClose(WebSocket, int, String)
  • Значения константных полей

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

sendText

CompletableFuture<WebSocket> sendText(CharSequence data, boolean last)
Отправляет текстовые данные с символами из указанной последовательности символов.

Последовательность символов нельзя изменять до завершения CompletableFuture, возвращённого этим методом.

CompletableFuture, возвращённое этим методом, может завершиться исключением в следующих случаях:

  • IllegalStateException — если выполняется ожидающая операция отправки текстовых или двоичных данных либо предыдущие двоичные данные не завершают сообщение
  • IOException — если произошла ошибка ввода-вывода или выход закрыт
Примечание по реализации:
Если data является некорректной последовательностью UTF-16, операция завершится ошибкой IOException.
Параметры:
data — данные
last — true, если этот вызов завершает сообщение, иначе false
Возвращает:
CompletableFuture, выполнение которого завершается с этим WebSocket после отправки данных

sendBinary

CompletableFuture<WebSocket> sendBinary(ByteBuffer data, boolean last)
Отправляет двоичные данные, содержащие байты из указанного буфера.

Данные находятся в байтах от текущей позиции буфера до его предела. После нормального завершения CompletableFuture, возвращённого этим методом, в буфере не останется байтов. До этого момента к буферу нельзя обращаться.

CompletableFuture, возвращённое этим методом, может завершиться исключением в следующих случаях:

  • IllegalStateException — если выполняется ожидающая операция отправки текстовых или двоичных данных либо предыдущие текстовые данные не завершают сообщение
  • IOException — если произошла ошибка ввода-вывода или выход закрыт
Параметры:
data — данные
last — true, если этот вызов завершает сообщение, иначе false
Возвращает:
CompletableFuture, выполнение которого завершается с этим WebSocket после отправки данных

sendPing

CompletableFuture<WebSocket> sendPing(ByteBuffer message)
Отправляет сообщение Ping с байтами из указанного буфера.

Сообщение содержит не более 125 байтов от текущей позиции буфера до его предела. После нормального завершения CompletableFuture, возвращённого этим методом, в буфере не останется байтов. До этого момента к буферу нельзя обращаться.

CompletableFuture, возвращённое этим методом, может завершиться исключением в следующих случаях:

  • IllegalStateException — если выполняется ожидающая операция отправки ping или pong
  • IllegalArgumentException — если сообщение слишком длинное
  • IOException — если произошла ошибка ввода-вывода или выход закрыт
Параметры:
message — сообщение
Возвращает:
CompletableFuture, выполнение которого завершается с этим WebSocket после отправки сообщения Ping

sendPong

CompletableFuture<WebSocket> sendPong(ByteBuffer message)
Отправляет сообщение Pong с байтами из указанного буфера.

Сообщение содержит не более 125 байтов от текущей позиции буфера до его предела. После нормального завершения CompletableFuture, возвращённого этим методом, в буфере не останется байтов. До этого момента к буферу нельзя обращаться.

Поскольку реализация WebSocket автоматически отправляет ответное сообщение pong при получении ping, явная отправка сообщения pong требуется редко.

CompletableFuture, возвращённое этим методом, может завершиться исключением в следующих случаях:

  • IllegalStateException — если выполняется ожидающая операция отправки ping или pong
  • IllegalArgumentException — если сообщение слишком длинное
  • IOException — если произошла ошибка ввода-вывода или выход закрыт
Параметры:
message — сообщение
Возвращает:
CompletableFuture, выполнение которого завершается с этим WebSocket после отправки сообщения Pong

sendClose

CompletableFuture<WebSocket> sendClose(int statusCode, String reason)
Инициирует штатное закрытие выходной стороны этого WebSocket, отправляя сообщение Close с указанным кодом состояния и причиной.

statusCode — это целое число из диапазона 1000 <= code <= 4999. Коды состояния 1002, 1003, 1006, 1007, 1009, 1010, 1012, 1013 и 1015 недопустимы. Поведение для остальных кодов состояния зависит от реализации. Допустимое значение reason — это строка, представление которой в UTF-8 не превышает 123 байтов.

CompletableFuture, возвращённое этим методом, может завершиться исключением в следующих случаях:

  • IllegalArgumentException — если statusCode недопустим или если reason недопустима
  • IOException — если произошла ошибка ввода-вывода или выход закрыт

Если CompletableFuture, возвращённое этим методом, не завершается с IllegalArgumentException и метод не выбрасывает NullPointerException, выход будет закрыт.

Если вход ещё не закрыт, он остаётся открытым до получения сообщения Close (полученного), вызова abort или возникновения ошибки.

Примечание к API:
В типичном случае используйте предоставленную целочисленную константу NORMAL_CLOSURE в качестве кода состояния и пустую строку в качестве причины:
     CompletableFuture<WebSocket> webSocket = ...
     webSocket.thenCompose(ws -> ws.sendText("Hello, ", false))
            .thenCompose(ws -> ws.sendText("world!", true))
            .thenCompose(ws -> ws.sendClose(WebSocket.NORMAL_CLOSURE, ""))
            .join();
Метод sendClose не закрывает вход этого WebSocket. Он лишь закрывает выход этого WebSocket, отправляя сообщение Close. Чтобы закрыть вход, вызовите метод abort. Ниже приведён пример приложения, которое отправляет сообщение Close, а затем запускает таймер. Если в течение указанного времени данные не поступят, таймер сработает, и сигнал тревоги прервёт WebSocket:
MyAlarm alarm = new MyAlarm(webSocket::abort);
WebSocket.Listener listener = new WebSocket.Listener() {

    public CompletionStage<?> onText(WebSocket webSocket,
                                     CharSequence data,
                                     boolean last) {
        alarm.snooze();
        ...
    }
    ...
};
...
Runnable startTimer = () -> {
    MyTimer idleTimer = new MyTimer();
    idleTimer.add(alarm, 30, TimeUnit.SECONDS);
};
webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "ok").thenRun(startTimer);
Параметры:
statusCode — код состояния
reason — причина
Возвращает:
CompletableFuture, выполнение которого завершается с этим WebSocket после отправки сообщения Close

request

void request(long n)
Увеличивает счётчик вызовов методов приёма.

Этот WebSocket вызовет у связанного слушателя методы onText, onBinary, onPing, onPong или onClose (то есть методы приёма) ещё не более n раз.

Примечание к API:
Параметр этого метода — это количество запрашиваемых у данного WebSocket вызовов методов связанного слушателя, а не количество сообщений. Иногда сообщение может быть передано слушателю за один вызов, но так бывает не всегда. Например, сообщения Ping, Pong и Close передаются за один вызов методов onPing, onPong и onClose соответственно. Однако передача сообщений Text и Binary за один вызов методов onText и onBinary зависит от логического аргумента (last) этих методов. Если last имеет значение false, значит, сообщение передано не полностью.

Ниже приведён пример слушателя, который запрашивает вызовы по одному, пока не будет собрано полное сообщение, а затем обрабатывает результат:

    WebSocket.Listener listener = new WebSocket.Listener() {

    StringBuilder text = new StringBuilder();

    public CompletionStage<?> onText(WebSocket webSocket,
                                     CharSequence message,
                                     boolean last) {
        text.append(message);
        if (last) {
            processCompleteTextMessage(text);
            text = new StringBuilder();
        }
        webSocket.request(1);
        return null;
    }
};
Параметры:
n — количество вызовов
Выбрасывает:
IllegalArgumentException — если n <= 0

getSubprotocol

String getSubprotocol()
Возвращает подпротокол, используемый этим WebSocket.
Возвращает:
подпротокол или пустую строку, если подпротокол отсутствует

isOutputClosed

boolean isOutputClosed()
Проверяет, закрыт ли выход этого WebSocket.

Если этот метод возвращает true, последующие вызовы также будут возвращать true.

Возвращает:
true, если выход закрыт; иначе false

isInputClosed

boolean isInputClosed()
Проверяет, закрыт ли вход этого WebSocket.

Если этот метод возвращает true, последующие вызовы также будут возвращать true.

Возвращает:
true, если вход закрыт; иначе false

abort

void abort()
Резко закрывает вход и выход этого WebSocket.

После возврата этого метода вход и выход будут закрыты. Все ожидающие операции отправки завершатся ошибкой IOException. Последующие вызовы abort не будут иметь эффекта.

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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://docs.oracle.com/en/java/javase/25/docs/api/java.net.http/java/net/http/WebSocket.html

Spec-Zone.ru

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