2012-05-18 3 views
2

У меня есть некоторые вопросы в понимании связи через веб-связь. AFAIU, в стороне клиента, это работает так:понимание websockets на стороне сервера

  1. От клиента, новый обработчик Оправа создается с помощью "нового WebSocket ('WS: // blahblah')"
  2. Затем с помощью метода OnOpen() его известно, что мы связаны с WS сервера
  3. Использование OnMessage() metthod, его известно, что сообщение было получено от WS сервера
  4. OnClose() метод диктует соединение сокет закрыт

Так от клиента с точки зрения его ясности. Но с точки зрения сервера, как идет поток (как указано выше для клиента) и что именно означает серверный процесс websocket, и что именно мы имеем в виду, когда связь происходит на TCP и как мы проверяем это (мои аплологии, если вопрос очень простой)

Может ли кто-нибудь объяснить. Спасибо в advannce

ответ

4

На стороне сервера это действительно зависит от реализации, языка и API библиотеки websockets или вы используете свою реализацию.

Это описание актуально только для реализации Web-сокетов RAW и не основано на использовании каких-либо библиотек для работы с протоколом WebSockets. Библиотеки, такие как jWebSockets (Java), SignalR, socket.io и другие, будут иметь совершенно другие процессы для работы с WebSockets.

Если речь идет о сырой реализации на сырых сокетов, поэтому процесс так:

  1. Создание на стороне сервера TCP сокет, привязку к определенному порту и слушать его, а затем положить на прием состояние. Принятие может быть блокирующим или неблокирующим. Я использую .Net и выполняю асинхронное прием, таким образом, он будет запускать метод каждый раз, когда есть подключение к серверу. 1b. Клиент, вызванный через JS: новый WebSocket (...);
  2. После принятия нового сокета он должен начать получать данные. Протокол TCP основан на потоке, но не на основе сообщений.
  3. Протокол WebSockets требует, чтобы HTTP-соединение было выполнено, прежде чем вы сможете общаться. Поэтому сразу после приема нового сокета вы начинаете получать данные, и сначала то, что вы получите, - это данные рукопожатия - некоторые строки текста.
  4. Продолжить процесс рукопожатия. Это означает, что вы читаете данные подтверждения и генерируете данные ответа на ответ на стороне сервера и отправляете их в WebSocket. 4b. Если данные подтверждения будут проверены и проверены клиентской стороной (браузером), вы получите обратный вызов «onopen», иначе вы сможете получить «onerror» и «onclose» после него.
  5. После того, как рукопожатие завершено, вы можете получать и отправлять сообщения. Сообщения основаны на данных (не сырых) на основе протокола WebSockets. И WebSockets - протокол на основе MESSAGE. Поэтому перед отправкой данных для логической обработки вам необходимо убедиться, что вы прочитали определенное количество данных.
  6. Для получения данных на стороне сервера, если вы используете собственную реализацию, вам необходимо реализовать чтение из потока сокетов TCP. Для этого вам всегда нужно читать только 2 байта, если будет несколько (2 байта) - это данные заголовка, декодировать его на основе спецификации кадрового кодирования данных и продолжать читать остальную часть данных, чтобы выяснить, есть ли затем маскировать байты байтов и длину. Это все в заголовке. Но заголовок может быть немного другой длины.Вот почему вы должны сначала прочитать только 2 байта, а затем некоторые после. После того, как вы получите длину, вы должны точно прочитать эту длину байтов из потока сокетов TCP. После того, как все прочитаны, и фактические данные демаскируются (если маскировка включена, поскольку мой опыт всегда включен), после этого вы можете поместить сокет в чтение некоторых других данных с самого начала. Не начинайте читать новое сообщение до того, как закончите чтение текущего.
  7. После того, как сообщение прочитано и демонтировано, у вас будут необработанные данные, в большинстве случаев это просто строка, которую вы отправили с клиентом, используя «socket.send (« ... »);».
  8. Для отправки данных необходимо взять необработанные строковые данные, а затем получить байты строки с использованием кодировки UTF8, а после обложки с кадрированием данных, поэтому она обратная, как чтение, только разница в том, что вы не должны маскировать. Таким образом, данные от сервера к клиенту не замаскированы.
  9. После того, как вы сделали двоичный код и отправили его, если все правильно, вы можете получить на стороне клиента «onmessage» с данными, которые вы отправили.

Клиент никогда не получит часть данных или неупорядоченных данных. Он всегда будет получать пакеты, которые вы отправили, и всегда, когда отправляете. Сервер может получать данные частично на основе низкоуровневых процессов уровня TCP. Но получат всегда приказанные.

Настоящий протокол надежный и надежный.

Наиболее популярная спецификация протокола WebSockets RFC 6455, помните, что iOS использует другую спецификацию, и они могут быть несовместимы друг с другом, что означает, что вам необходимо создать другую функцию установления связи и кадрирование данных специально для разных реализаций протокола.

+1

Отличный ответ. Я пытаюсь прочитать поток байтов из [binaryjs] (http://binaryjs.com/) на сервере Java. Учитывая, что нет binaryjs Java-сервера, возможно ли это после этого подхода? – eskalera

+0

Да. В приведенном выше тексте описывается транспортный протокол WebSocket, который применяется к любому приложению WebSocket, а binaryjs использует WS в качестве транспортного протокола. Но вам придется реализовать поверх него протокол данных, который будет соответствовать спецификациям binaryjs. – moka

0

После того, как рукопожатие сделано, вы можете получать и отправлять сообщения. Сообщения основаны на данных (не сырые) на основе протокола WebSockets. И WebSockets - протокол на основе MESSAGE. Поэтому перед отправкой данных для логической обработки вы должны убедиться, что вы прочитали определенное количество данных сообщения .

Вот еще несколько информаций к этому:

Таким образом, сервер может фрагментировать сообщения в нескольких кадрах WebSocket, которые посылают в клиент.

Смежные вопросы