Больше отличных статей.
«Микросервисы — это не все, а лишь подмножество определенного домена».
С таким количеством компонентов мониторинга всегда найдется подходящий для вас
«С Нетти, что мы разрабатываем? 》
«Вероятно, это наиболее подходящая спецификация Redis».
«Портрет программиста, десять лет взлетов и падений»
Самая полезная серия:
«Наиболее часто используемый набор навыков «vim» в производственной среде Linux.
«Наиболее часто используемый набор навыков «Sed» в производственной среде Linux.
«Наиболее часто используемый набор навыков «AWK» в производственной среде Linux.
WebSocket — относительно новый протокол, он сопровождаетсяhtml5Он родился от спецификации, хотя он все еще относительно молоды, но большинство основных браузеров уже поддерживают его. Он широко используется и широко используется, и проникнул в различные сценарии переднего и заднего развития.
на http一问一答Неудовлетворенность двусторонним процессом породила поддержку двустороннего общения.WebSocketрождение. Веб-сокет — это不太干净протокол.
1. Может ли протокол WebSocket инициироваться только браузером?
нет. Текущая аудитория для этого протокола - это не только веб-разработчики.
WebSocket — это просто протокол, он такой же, как протокол http, с использованием类似okhttpкомпоненты, которые можно вызывать где угодно, даже с помощью WebSocketRPCРамка.
2. Какая связь между WebSocket и HTTP?
WebSocket, как и http, находится вOSIВерхний слой в модели:应用层.
httpСоглашение рукопожатие рук, а после успешного рукопожатия он превратится вTCP通道, и больше никогда не увидите http.
С помощью netstat или ss можно увидеть соответствующее подключение, внешне ничем не отличающееся от сокета на уровне абстракции.
3. В чем разница между WebSocket и длинным опросом?
Длинный опрос означает, что клиент отправляет запрос, а сервер всегда будет ждать на этом соединении (разумеется, очень большой таймаут), и не вернется, пока не будут данные.Это все еще вопросно-ответный режим . Такие, как знаменитый Контед.
После успешного рукопожатия WebSocket全双工В TCP-канале данные могут активно отправляться с сервера на клиент, и нет никакой разницы между приложениями на обоих концах канала.
Соединение, созданное WebSocket, отличается от длинного соединения Http. Поскольку нижний уровень длинного соединения Http по-прежнему является протоколом Http, это все еще вопрос и ответ, но Hold живет долгоживущим соединением.
Длительный опрос и длинные соединения Http блокируют ввод-вывод, но WebSocket может не блокировать (в частности, мультиплексирование).
4. Как создать подключение?
Создание соединения WebSocket осуществляется по протоколу Http. Этот дизайн в основном основан на совместимости, и очень удобно инициировать запросы в браузере, что кажется довольно запутанным.
На рисунке ниже показан типичный ws-запрос, инициированный браузером, который очень похож на http-запрос. Однако это выглядит как фаза запроса:
ws://\*\*\*или безопасный протокол, использующий шифрование SSL/TLS.wss:, используемый для идентификации запроса WebSocket.
1. Сначала через заголовок HttpUpgradeдомен, запрашивающий преобразование протокола. Если сервер его поддерживает, вы можете переключиться на протокол WebSocket. Проще говоря: соединение уже есть, и переход на протокол ws через рукопожатие — это просто переключение состояния соединения.
1,ConnectionДомен можно рассматривать какUpgradeИнформация заголовка сопряжения домена. Прокси-сервер, как Nginx - это обработать соединение первым, а затем инициировать преобразование протокола.
SEC-Websocket-ключ - это случайная строка, которая использует эти данные для создания сводки информации SHA-1. Ну, вы можете попытаться избежать нормальных HTTP-запросов, которые будут приняты для ошибок для протоколов WebStocket.
Другие, например заголовки Sec-WebSocket*, указывают подпротоколы, поддерживаемые клиентом, и другую информацию. Как и mqtt, который очень популярен в IoT, его можно использовать как подпротокол WebSocket.
<script>
var ws = new WebSocket('ws://localhost:80');
ws.onopen = function () {
console.log('ws onopen');
ws.send('from client: hello');
};
ws.onmessage = function (e) {
console.log('ws onmessage');
console.log('from server: ' + e.data);
};
...
</script>
5. Как обрабатывать данные?
WebSocket работает посредством уведомления о событии. Он содержит четыре события и два действия (отправить и закрыть).
События веб-сокета
| событие | крюк | Примечание |
|---|---|---|
| open | onopen | Запускается при установлении соединения |
| message | onmessage | Срабатывает, когда клиент получает данные от сервера |
| error | onerror | Срабатывает при возникновении ошибки связи |
| close | onclose | Запускается, когда соединение закрыто |
Данные могут передаваться напрямую черезSocket.send()способ передачи.
По хрому Inspect->Network->WS можно увидеть на странице WebSocket connection. Код операции FIG равен 2, что указывает на то, что это двоичный кадр.
Ссылаться на:(tools.I ETF.org/HTML/RFC645…)
сердцебиение
Для операций ping и pong, соответствующих пульсу, коды операций равны 0x9 и 0xA соответственно. Сторона, получающая пульс, должна самостоятельно обновить время обновления пульса. такой жеС Нетти, что именно мы разрабатываем?Как и во введении, в некоторых мобильных средах необходимо более разумно контролировать сердцебиение.
6. Как использовать Nginx для балансировки нагрузки?
Официальный сайт nginx привел примеры. В основном настройки заголовков Upgrade и Connection.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
Следует отметить, что nginx выполняет балансировку нагрузки и не требует настройки.ip_hashи другие параметры, nginx естественно поддерживает. Поскольку ip_hash использует для хеширования только первые три цифры IP-адреса, это также может привести к дисбалансу на стороне сервера.
7. Как реализовать java-сервер?
Вы можете реализовать пакет под javax.websocket, простая реализация сервера WS. В настоящее время вы можете в основном написать код аннотацией, напримерServerEndpoint.
Для написания сервера рекомендуется использовать netty-socketio на базе netty. Поскольку используется netty, он может подключаться на нескольких уровнях, получать некоторые статистические данные и выполнять некоторые управляющие команды. socketio — это решение, которое имеет клиентов на нескольких языках и решает большинство проблем совместимости на рынке.
8. Что может WebSocket?
Функция уведомления
При длительном соединении, когда сервер отправляет новые сообщения, они могут быть переданы пользователю в режиме реального времени. Как и уведомления и комментарии на Zhihu, вы можете использовать связь WebSocket.
определенное использованиеH5Чтобы упростить разработку, WebSocket также будет использоваться для уведомлений о сообщениях.Поскольку он отправляется в режиме реального времени, он будет иметь лучший пользовательский интерфейс.
Сбор данных
Некоторые неоптимальные данные, такие как журнал поведения, трассировка, сбор стека исключений и т. д., могут передаваться через выделенный канал WebSocket. Это может увеличить концентрацию информации и может своевременно подтолкнуть соответствующую конфигурацию для поведения пользователя. Так как большинство ядер браузеров поддерживают его, это сделает клиентAPMМодель программирования проста.
Шифрование и& аутентификация
Хотя многие пакеты WebSocket можно перехватить с помощью Fiddler, Charles и т. Однако, если в то же время включить SSL для передачи зашифрованных двоичных данных, стоимость взлома будет значительно увеличена, и это будет намного безопаснее.
крюк управления обратным ходом
Это ... Поскольку это дуплексное длительное соединение, сервер может продвигать некоторые команды крючка или даже код напрямую и выполнять их на клиенте. Например, возьмите скриншот, запишите звук и выращивать пони. Пока пользователь передает заявку авторизации, остальное зависит от вас.
Я считаю, что Alipay тайно вызывает вашу камеру, чтобы сфотографировать вас.
End
Тогда появление кометы долгое время удивляло и вдохновляло. Но технологии меняются с каждым днем, cometd устаревает, а Socket.io стремительно развивается. После периода хаоса для WebSocket спецификация становилась все более и более совершенной, а использование становилось все более и более удобным, и нет необходимости иметь дело с таким количеством совместимости.
Но суть его в том, чтобы расфасовать старое вино в новые бутылки, а суп поменять, не меняя лекарства. Разработка WebSocket выиграла от формулировки спецификации HTML5. Смысл спецификации в том, чтобы ограничить реализацию фантазии производителей и указать направление развития.
Это, конечно, имеет типичный контрпример, которыйie. Теперь только группа признанных ** все еще настаивает на использовании.