Spec-Zone.ru › OpenJDK 24

Интерфейс 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 и связанным с ним обработчиком аналогично отношению подписки и связанного подписчика типа Flow.
С:
11

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

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

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

Модификатор и тип Поле Описание
static final int NORMAL_CLOSURE
Код состояния сообщения закрытия 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
Статус-код сообщения WebSocket Close (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 подпротокол.
Возвращает:
подпротокол или пустую строку, если подпротокол отсутствует
END_OF_DOCUMENT_MARKER

isOutputClosed

boolean isOutputClosed()
Указывает, закрыт ли выходной поток этого WebSocket.

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

Возвращает:
true, если закрыт, false в противном случае

isInputClosed

boolean isInputClosed()
Указывает, закрыт ли входной поток этого WebSocket.

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

Возвращает:
true, если закрыт, false в противном случае

abort

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

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

© 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.net.http/java/net/http/WebSocket.html

Spec-Zone.ru

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