На стороне сервера это действительно зависит от реализации, языка и API библиотеки websockets или вы используете свою реализацию.
Это описание актуально только для реализации Web-сокетов RAW и не основано на использовании каких-либо библиотек для работы с протоколом WebSockets. Библиотеки, такие как jWebSockets (Java), SignalR, socket.io и другие, будут иметь совершенно другие процессы для работы с WebSockets.
Если речь идет о сырой реализации на сырых сокетов, поэтому процесс так:
- Создание на стороне сервера TCP сокет, привязку к определенному порту и слушать его, а затем положить на прием состояние. Принятие может быть блокирующим или неблокирующим. Я использую .Net и выполняю асинхронное прием, таким образом, он будет запускать метод каждый раз, когда есть подключение к серверу. 1b. Клиент, вызванный через JS: новый WebSocket (...);
- После принятия нового сокета он должен начать получать данные. Протокол TCP основан на потоке, но не на основе сообщений.
- Протокол WebSockets требует, чтобы HTTP-соединение было выполнено, прежде чем вы сможете общаться. Поэтому сразу после приема нового сокета вы начинаете получать данные, и сначала то, что вы получите, - это данные рукопожатия - некоторые строки текста.
- Продолжить процесс рукопожатия. Это означает, что вы читаете данные подтверждения и генерируете данные ответа на ответ на стороне сервера и отправляете их в WebSocket. 4b. Если данные подтверждения будут проверены и проверены клиентской стороной (браузером), вы получите обратный вызов «onopen», иначе вы сможете получить «onerror» и «onclose» после него.
- После того, как рукопожатие завершено, вы можете получать и отправлять сообщения. Сообщения основаны на данных (не сырых) на основе протокола WebSockets. И WebSockets - протокол на основе MESSAGE. Поэтому перед отправкой данных для логической обработки вам необходимо убедиться, что вы прочитали определенное количество данных.
- Для получения данных на стороне сервера, если вы используете собственную реализацию, вам необходимо реализовать чтение из потока сокетов TCP. Для этого вам всегда нужно читать только 2 байта, если будет несколько (2 байта) - это данные заголовка, декодировать его на основе спецификации кадрового кодирования данных и продолжать читать остальную часть данных, чтобы выяснить, есть ли затем маскировать байты байтов и длину. Это все в заголовке. Но заголовок может быть немного другой длины.Вот почему вы должны сначала прочитать только 2 байта, а затем некоторые после. После того, как вы получите длину, вы должны точно прочитать эту длину байтов из потока сокетов TCP. После того, как все прочитаны, и фактические данные демаскируются (если маскировка включена, поскольку мой опыт всегда включен), после этого вы можете поместить сокет в чтение некоторых других данных с самого начала. Не начинайте читать новое сообщение до того, как закончите чтение текущего.
- После того, как сообщение прочитано и демонтировано, у вас будут необработанные данные, в большинстве случаев это просто строка, которую вы отправили с клиентом, используя «socket.send (« ... »);».
- Для отправки данных необходимо взять необработанные строковые данные, а затем получить байты строки с использованием кодировки UTF8, а после обложки с кадрированием данных, поэтому она обратная, как чтение, только разница в том, что вы не должны маскировать. Таким образом, данные от сервера к клиенту не замаскированы.
- После того, как вы сделали двоичный код и отправили его, если все правильно, вы можете получить на стороне клиента «onmessage» с данными, которые вы отправили.
Клиент никогда не получит часть данных или неупорядоченных данных. Он всегда будет получать пакеты, которые вы отправили, и всегда, когда отправляете. Сервер может получать данные частично на основе низкоуровневых процессов уровня TCP. Но получат всегда приказанные.
Настоящий протокол надежный и надежный.
Наиболее популярная спецификация протокола WebSockets RFC 6455, помните, что iOS использует другую спецификацию, и они могут быть несовместимы друг с другом, что означает, что вам необходимо создать другую функцию установления связи и кадрирование данных специально для разных реализаций протокола.
Отличный ответ. Я пытаюсь прочитать поток байтов из [binaryjs] (http://binaryjs.com/) на сервере Java. Учитывая, что нет binaryjs Java-сервера, возможно ли это после этого подхода? – eskalera
Да. В приведенном выше тексте описывается транспортный протокол WebSocket, который применяется к любому приложению WebSocket, а binaryjs использует WS в качестве транспортного протокола. Но вам придется реализовать поверх него протокол данных, который будет соответствовать спецификациям binaryjs. – moka