РЕЗЮМЕ:
Мне нужна помощь в создании сервера веб-сокетов с Java SE 11. В частности, мне нужно получить соединение через сокет tcp из запроса http и назначить его клиенту веб-сокета. , т. Е. Потому что Java SE поддерживает клиенты websocket, но не серверы. Передав сокет-соединение, клиент веб-сокета станет конечной точкой веб-сокета . (Подробное объяснение ниже.)
В настоящее время я использую клиент веб-сокета java.net.http (Java SE) и уже создал собственный HTTP-сервер, используя com.sun.net.httpserver. Я хорошо знаю протоколы, но плохо знаком с Java-классами, которые необходимы. Ответ где-то "под капотом", я считаю; или, возможно, есть более простой способ, чем я подозреваю.
Целью здесь является максимально возможное использование компонентов Java SE; в результате чего появляются базовые небольшие встроенные возможности HTTP и Websocket Требования исключают использование сторонних решений.
Подробное объяснение:
Процессы HTTP и Websocket начинаются одинаково. Клиентский компонент запрашивает соединение через сокет (tcp) с серверного компонента. В случае успеха клиент отправляет подробную информацию запроса в виде заголовков HTTP. Сервер распознает запрос на соединение через Websocket, если запрос включает пару имя-значение upgrade: websocket
. Это позволяет легко интегрировать серверы HTTP и Websocket в один и тот же порт.
Если нет запроса на обновление, весь запрос обрабатывается в привычном цикле HTTP-запрос-ответ. Если запрос включает upgrade: websocket
, то успешное «рукопожатие» приводит к событию open
в процессе веб-сокета клиента. Оба процесса полагаются на базовое сокетное соединение для завершения или продолжения связи.
Для веб-сокетов различие между клиентом и сервером заканчивается, когда соединение установлено. Клиент делает запрос сокета, сопровождаемый деталями запроса. Сервер использует сокет сервера для прослушивания запросов. После подключения они оба становятся endpoints
, способными отправлять и получать сообщения через установленное соединение.
Мой компонент HTTP-сервера прослушивает запросы на подключение к сокету, а затем проверяет наличие upgrade: websocket
в заголовках. У меня есть собственный код для завершения запроса на установление соединения в соответствии с протоколом Websocket.
Что нужно сделать, чтобы превратить мой клиент Websocket в конечную точку, - это передать Socket из компонента HTTP-сервера в Websocket. Я прошу помощи о том, как это сделать.
Небольшое обновление: Я продолжаю работать над этим сам - получил немного исходного кода Websocket от Zulu OpenJDK сегодня ... Сторона Websocket использует java.nio SocketChannel. Но я нахожу это как частные уроки. Я начинаю плохо относиться к дизайну этого нового материала.