Nodejs веб-розетки без модулей - PullRequest
0 голосов
/ 05 марта 2020

Поэтому я пытаюсь создать сервер веб-сокетов в nodejs без каких-либо не встроенных модулей (я имею в виду такие модули, как socket.io или ws), когда я подключаюсь к нему с net.createConnection(), он работает нормально, но как мне сделать так, чтобы я мог отправлять и получать данные на / с сервера, используя клиентскую сторону javascript, например:

let ws = new WebSocket("ws://localhost:8000")
ws.onopen = () => {
    ws.send("sending data")
}

Любые примеры будут очень цениться

1 Ответ

2 голосов
/ 06 марта 2020

Соединение webSocket имеет свою собственную схему соединения (которая начинается с http-соединения), схему обновления с http до протокола webSocket, свою собственную схему согласования безопасности и собственный формат данных, и были некоторые изменения в спецификации c со временем, что означает, что вам может потребоваться поддержка нескольких версий для поддержки всех клиентов. Чтобы реализовать сервер webSocket, вы должны реализовать все это.

Необработанный протокол определяется здесь: https://tools.ietf.org/html/rfc6455

В двух словах:

  1. Каждое соединение webSocket начинается с http-запроса, который содержит несколько пользовательских заголовков, указывающих, что это запрос «обновить» протокол webSocket. Этот первоначальный запрос также содержит ключ безопасности и номер версии безопасности.

  2. Если сервер принимает обновление до протокола webSocket, он отправляет ответ с другим ключом безопасности.

  3. После подтверждения в этот момент клиент или сервер могут начать отправку пакетов на другую сторону, используя формат пакета кадра данных webSocket и используя соответствующие ключи безопасности.

Пример:

Клиент отправляет:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

Сервер отвечает:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

И, идея, как выглядит фрейм данных:

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+

Вы можете увидеть некоторые другие обсуждения того, как протокол в этих других ответах:

nodejs net сокеты + websocket без socket.io

Используют ли реализации веб-сокета внутренне протокол HTTP?

В чем разница между обменом данными через WebSocket и обычным сокетом?

Если только это Academi c Exe Из соображений изучения, это действительно, очень неэффективное использование вашего времени разработчика для повторной реализации протокола низкого уровня, для которого уже существуют стандартные, хорошо протестированные реализации с открытым исходным кодом. Вы будете тратить много времени на низкоуровневое переключение битов и тестирование совместимости с различными реализациями клиентов, а затем больше времени на обслуживание по мере развития стандарта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...