Все соединения 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