Почему мы передаем http-сервер экземпляру websocket в javascript на nodejs? - PullRequest
0 голосов
/ 12 января 2020

Что конкретно означает что-то вроде var WebSocketServer = require("ws").Server, express = require("express"), http = require("http"), app = express(), server = http.createServer(app); var wss = new WebSocketServer({server: server});? Что это на самом деле делает - зачем вам давать серверу веб-сокета http-сервер?

Ответы [ 2 ]

0 голосов
/ 12 января 2020

Все соединения webSocket начинаются с http-запроса от клиента (который содержит заголовок upgrade). Как только обе стороны согласятся с тем, что обновление до протокола webSocket в порядке и произвели обмен некоторыми учетными данными, этот протокол обновляется до протокола webSocket, и вся будущая связь через этот сокет использует протокол webSocket, а не протокол http.

Но КАЖДЫЙ сервер webSocket должен быть http-сервером для процесса инициации webSocket.

Вы можете выбрать, хотите ли вы, чтобы этот http-сервер был общим http-сервером, который также используется для вашего собственного http запросы или хотите ли вы создать отдельный http-сервер только для соединений webSocket. Если вы используете отдельный http-сервер, то он должен находиться на отдельном порту (поскольку у вас не может быть двух серверов на одном хосте, работающих на одном и том же порту).

При использовании общего http-сервера есть маленький слушатель webSocket, который проверяет каждый входящий HTTP-запрос. Если этот входящий запрос содержит заголовок Upgrade: websocket, он принимает этот входящий запрос. В противном случае он позволяет обычному http-серверу logi c обрабатывать запрос как обычный http-запрос. Таким образом, один и тот же http-сервер может использоваться как для http-запросов, так и для входящих запросов на подключение к веб-сокету.

Таким образом, при совместном использовании с сервером http все (и ваши запросы http, и ваши соединения webSocket) могут работать на обычных портах по умолчанию, порт 80 (для http) или порт 443 (для https).

Некоторые соответствующие ссылки:

Почему WebSocket может совместно использовать порт 80 с HTTP «после рукопожатия»?

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

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

Как работает socket.io

Примеры установления соединения по протоколу websocket через http

0 голосов
/ 12 января 2020

Это потому, что соединение WebSocket часто является Upgrade от HTTP-соединения. HTTP-сервер обрабатывает полное рукопожатие с клиентом, а затем передает все остальное WebSocket. См. Механизм обновления протокола для получения дополнительной информации об этом.

...