Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность
Эта статья приняла участие"Проект "Звезда раскопок"", чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам
Введение
В эпоху стремительного роста скорости интернета браузер стал для нас входом в различные сервисы, сложно представить, как наш онлайн-мир должен работать без браузера. Теперь мне не терпится перенести операционную систему в браузер. Но не все приложения требуют выполнения браузеров, например, для связи между серверами и серверами, для взаимодействия с сервером необходимо использовать самодельный клиент.
В этой статье будут представлены принцип и конкретная реализация использования клиента 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…
Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!
Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!