Подтвердить что ты не робот

Можно ли включить tcp, http и websocket все, используя один и тот же порт?

Я пытаюсь включить tcp, http и websocket.io на одном и том же порту. Я начал с сервера tcp (часть выше ////line ), он работал. Затем я запустил пример эхо-сервера

4b9b3361

Ответ 1

Вы можете иметь несколько разных протоколов, обрабатываемых одним и тем же портом, но есть несколько предостережений:

  • Должен быть какой-то способ для сервера обнаружить (или согласовать) протокол, который клиент хочет говорить. Вы можете думать об отдельных портах как о обычном способе определения протокола, который клиент хочет говорить.

  • Только один серверный процесс может фактически прослушивать порт. Этот сервер может служить только для определения типа протокола и последующей пересылки на несколько других серверов, но каждый порт принадлежит одному серверному процессу.

  • Вы не можете поддерживать несколько протоколов, когда сервер говорит первым (потому что нет способа обнаружить протокол клиента). Вы можете поддерживать один протокол первого сервера с несколькими протоколами первого клиента (добавив небольшую задержку после подтверждения, чтобы увидеть, будет ли клиент отправлять данные), но это немного не так.

Явная цель разработки протокола WebSocket состояла в том, чтобы позволить протоколам WebSocket и HTTP использовать один и тот же порт сервера. Начальное рукопожатие WebSocket представляет собой HTTP-совместимый запрос на обновление.

Сервер/мост websockify - это пример сервера, который может использовать 5 разных протоколов на одном и том же порту: HTTP, HTTPS (зашифрованный HTTP), WS (WebSockets), WSS (зашифрованные WebSockets) и ответ политики Flash. Сервер достигает пика по первому символу входящего запроса, чтобы определить, зашифрован ли он по протоколу TLS (HTTPS или WSS) или он начинается с "<" (запрос политики Flash). Если это запрос политики Flash, то он читает запрос, отвечает и закрывает соединение. В противном случае он считывает рукопожатие HTTP (зашифрованное или нет), а заголовки Connection и Upgrade определяют, является ли это запросом WebSocket или простым HTTP-запросом.

Отказ от ответственности: я сделал websockify

Ответ 2

Короткий ответ - нет, у вас не может быть разных серверов TCP/HTTP/Websocket, работающих на одном и том же порту.

Долгожданный ответ - Как websockets, так и HTTP работают поверх TCP. Таким образом, вы можете думать о сервере http или сервере websocket как о настраиваемом TCP-сервере (с определенным протоколом кодирования/декодирования с использованием протокола mgmt и протокола). Невозможно, чтобы несколько сокетов связывались с одной и той же парой портов/протоколов на машине, поэтому первая победит, а следующие получат исключения привязки сокетов.