Серия Netty: используйте netty для создания клиента веб-сокета

Java Netty WebSocket

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность

Эта статья приняла участие"Проект "Звезда раскопок"", чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам

Введение

В эпоху стремительного роста скорости интернета браузер стал для нас входом в различные сервисы, сложно представить, как наш онлайн-мир должен работать без браузера. Теперь мне не терпится перенести операционную систему в браузер. Но не все приложения требуют выполнения браузеров, например, для связи между серверами и серверами, для взаимодействия с сервером необходимо использовать самодельный клиент.

В этой статье будут представлены принцип и конкретная реализация использования клиента netty для подключения к веб-сокету.

браузерный клиент

Прежде чем представить клиент netty, давайте рассмотрим простой пример подключения клиента браузера к веб-сокету:

// 创建连接
const socket = new WebSocket('ws://localhost:8000');

// 开启连接
socket.addEventListener('open', function (event) {
    socket.send('没错,开启了!');
});

// 监听消息
socket.addEventListener('message', function (event) {
    console.log('监听到服务器的消息 ', event.data);
});

Здесь мы используем javascript, наиболее распространенный язык браузеров, и используем API веб-сокетов, предоставляемый браузером для работы, что очень просто.

Итак, использует ли клиент netty для реализации соединения через веб-сокет то же самое, что и использование javascript? Давайте исследовать вместе.

поддержка netty для клиентов websocket

Давайте посмотрим, что netty поддерживает для websocket, а затем посмотрим, как использовать эти классы инструментов.

WebSocketClientHandshaker

Как и сервер веб-сокетов, базовым классом клиента также является рукопожатие, которое здесь называется WebSocketClientHandshaker. Что делает этот класс? Посмотри.

Этот класс в основном реализует рукопожатие между клиентом и сервером.

Давайте посмотрим на конструктор его самого длинного параметра:

   protected WebSocketClientHandshaker(URI uri, WebSocketVersion version, String subprotocol,
                                        HttpHeaders customHeaders, int maxFramePayloadLength,
                                        long forceCloseTimeoutMillis, boolean absoluteUpgradeUrl) 

Параметр имеет URI подключения к веб-сокету, например: «ws://flydean.com/mypath».

Есть подпротокол типа подпротокола запроса, настраиваемые заголовки HTTP: customHeaders, максимальная длина полезной нагрузки кадра: maxFramePayloadLength, принудительное время закрытия тайм-аута и адрес URI для обновления с использованием протокола HTTP.

Как создать рукопожатие? Точно так же netty предоставляет метод WebSocketClientHandshakerFactory.

WebSocketClientHandshakerFactory предоставляет новый метод Handshaker, который может легко создавать различные версии рукопожатия:

        if (version == V13) {
            return new WebSocketClientHandshaker13(
                    webSocketURL, V13, subprotocol, allowExtensions, customHeaders,
                    maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
        }
        if (version == V08) {
            return new WebSocketClientHandshaker08(
                    webSocketURL, V08, subprotocol, allowExtensions, customHeaders,
                    maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
        }
        if (version == V07) {
            return new WebSocketClientHandshaker07(
                    webSocketURL, V07, subprotocol, allowExtensions, customHeaders,
                    maxFramePayloadLength, performMasking, allowMaskMismatch, forceCloseTimeoutMillis);
        }
        if (version == V00) {
            return new WebSocketClientHandshaker00(
                    webSocketURL, V00, subprotocol, customHeaders, maxFramePayloadLength, forceCloseTimeoutMillis);
        }

Видно, что по версии входящего протокола его можно разделить на WebSocketClientHandshaker13, WebSocketClientHandshaker08, WebSocketClientHandshaker07 и WebSocketClientHandshaker00.

WebSocketClientCompressionHandler

Вообще говоря, для протокола webSocket, чтобы улучшить производительность и скорость передачи и уменьшить использование пропускной способности сети, во время использования обычно вносятся дополнительные сжатия и расширения. Для работы с такими расширениями сжатия netty обеспечивает поддержку как на стороне сервера, так и на стороне клиента.

Для серверной стороны соответствующий обработчик называется WebSocketServerCompressionHandler, а для клиентской стороны соответствующий обработчик называется WebSocketClientCompressionHandler.

Добавляя эти два обработчика в соответствующий конвейер, можно реализовать поддержку расширения протокола сжатия в websocket.

Существует два уровня расширения протокола, permessage-deflate и perframe-deflate, которые соответствуют PerMessageDeflateClientExtensionHandshaker и DeflateFrameClientExtensionHandshaker соответственно.

Что касается того, как его сжимать, я не буду здесь подробно объяснять, заинтересованные партнеры сами разберутся.

Поток обработки сетевого клиента

После объяснения поддержки netty клиентов веб-сокетов в этом разделе объясняется, как netty использует эти инструменты для обработки сообщений.

Первый — создать Bootstrap клиента по обычной логике и добавить обработчик. Обработчик здесь — это обработчик на стороне клиента, настроенный для веб-сокета.

В дополнение к WebSocketClientCompressionHandler, упомянутому выше, это настраиваемый обработчик.

В пользовательском обработчике нам нужно иметь дело с двумя вещами, во-первых, создать обработчик, когда канал будет готов. Другое дело — обработка конкретных сообщений websocket.

Создать рукопожатие

Сначала создайте обработчик с помощью WebSocketClientHandshakerFactory:

TestSocketClientHandler handler =
     new TestSocketClientHandler(
        WebSocketClientHandshakerFactory.newHandshaker(
              uri, WebSocketVersion.V13, null, true, new DefaultHttpHeaders()));

Затем используйте рукопожатие для подключения рукопожатия, когда канал активен:

    public void channelActive(ChannelHandlerContext ctx) {
        handshaker.handshake(ctx.channel());
    }

Затем необходимо оценить, завершено ли состояние рукопожатия при получении сообщения, если оно не завершено, вызвать метод handshake.finishHandshake для его завершения вручную:

        if (!handshaker.isHandshakeComplete()) {
            try {
                handshaker.finishHandshake(ch, (FullHttpResponse) msg);
                log.info("websocket Handshake 完成!");
                handshakeFuture.setSuccess();
            } catch (WebSocketHandshakeException e) {
                log.info("websocket连接失败!");
                handshakeFuture.setFailure(e);
            }
            return;
        }

Когда рукопожатие завершено, можно выполнять обычные операции чтения и записи сообщений веб-сокета.

Обработка сообщений веб-сокета

Обработка сообщений websocket относительно проста, и полученное сообщение может быть преобразовано в WebSocketFrame для обработки.

        WebSocketFrame frame = (WebSocketFrame) msg;
        if (frame instanceof TextWebSocketFrame) {
            TextWebSocketFrame textFrame = (TextWebSocketFrame) frame;
            log.info("接收到TXT消息: " + textFrame.text());
        } else if (frame instanceof PongWebSocketFrame) {
            log.info("接收到pong消息");
        } else if (frame instanceof CloseWebSocketFrame) {
            log.info("接收到closing消息");
            ch.close();
        }

Суммировать

В этой статье объясняется поддержка клиента веб-сокета, предоставляемая netty, и конкретный процесс стыковки.Вы можете расширить базу, чтобы реализовать свою собственную бизнес-логику.

Примеры этой статьи могут относиться к:learn-netty4

Эта статья была включена вWoohoo. Floyd Press.com/25-Netty-Towering…

Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!