Russian Qt Forum
Ноябрь 23, 2024, 02:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: WebSocket + WebServer проксирование  (Прочитано 5140 раз)
RedDog
Гость
« : Март 07, 2013, 12:55 »

Надо реализовать такую схему:
Клиент (веб-браузер) подключается к веб-серверу по HTTPS, после загрузки страницы
клиент подключается по WebSocket с использованием того же канала HTTPS.
Т.е. необходимо одним сертификатом авторизироваться для HTTPS и WSS, и это должен быть один канал связи.
Веб сервер связывается с самописным (на С++) сервером по FastCGI.
Как можно реализовать вебсокет по одному каналу?
И как такое вообще можно провернуть?
Записан
alexis031182
Гость
« Ответ #1 : Март 07, 2013, 17:43 »

Разве открывается отдельное соединение для WS и WSS? По стандарту, вроде, должен использоваться тот же канал, просто осуществляется согласованный переход с одного протокола на другой.
Записан
RedDog
Гость
« Ответ #2 : Март 07, 2013, 20:51 »

Разве открывается отдельное соединение для WS и WSS? По стандарту, вроде, должен использоваться тот же канал, просто осуществляется согласованный переход с одного протокола на другой.
Я у себя реализовал схему такую (пока без ССЛ):
Поднял веб-сервер lighttpd, который по запросу выдает статическую страничку html с джаваскриптом, последний в свою очередь открывает веб-сокет на 1177 порту.
На этой же машине запустил сервер веб-сокетов (написанный на Qt). Все подключается и работает, но очень сильные сомнения, в том, что по одному каналу веб-сервер и веб-сокет работают.
Сейчас проверить не могу (на работе проект остался), но сдается мне, что если html страничку загружать не с сервера, а из файла, то в принципе картина работоспособности не поменяется, т.е. веб-сокет так же создастся, т.о. http соединение в этом случае ни при чем.
В общем вопрос трансформируется в следующий: как спроксировать этот веб сокет через веб-сервер lighttpd, таким образом, что бы сервер веб-сокета находился за вебсервером и не торчал отдельным портом в общую сеть?
Записан
alexis031182
Гость
« Ответ #3 : Март 07, 2013, 21:29 »

Я у себя реализовал схему такую (пока без ССЛ):
Поднял веб-сервер lighttpd, который по запросу выдает статическую страничку html с джаваскриптом, последний в свою очередь открывает веб-сокет на 1177 порту.
Я вероятно чего-то не понимаю. Зачем открывать новое соединение, если можно использовать текущее на 80 порту? WebSockets - это просто переключение языка общения между клиентом и сервером. Этот протокол и был создан для того, чтобы исключить необходимость в постоянном открытии новых соединений для проверки изменения данных и т.п. задач. Используется текущее открытое. Не отправляются заголовки. Сервер имеет возможность сообщить клиенту об изменении данных. То есть браузер и веб-сервер начинать работать на 80 порту как обычные сетевые приложения.

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

Сейчас проверить не могу (на работе проект остался), но сдается мне, что если html страничку загружать не с сервера, а из файла, то в принципе картина работоспособности не поменяется, т.е. веб-сокет так же создастся, т.о. http соединение в этом случае ни при чем.
Ну да. Ваш вебсервер должен быть одним приложением, чтобы заработало то, что Вы задумали.

В общем вопрос трансформируется в следующий: как спроксировать этот веб сокет через веб-сервер lighttpd, таким образом, что бы сервер веб-сокета находился за вебсервером и не торчал отдельным портом в общую сеть?
Вряд ли lighttpd умеет такое, а именно он должен это делать. С другой стороны, это всё равно будет новое отдельное соединение, пусть и между lighttpd и сервером веб-сокетов.
Записан
RedDog
Гость
« Ответ #4 : Март 07, 2013, 22:07 »

В принципе lighttpd не так важен, можно другой сервер.
Мне важно, что WebSocket не был отдельным подключением, а допустим по адресу https://localhost была статическая вебстраница, а по адресу https://localhost/websock сервер проксировал бы соединение на мой отдельный сервер.
Вот тут то я как раз и теряюсь - как его поднять, без указания дополнительно порта, ибо на 443 он уже из за вебсервера не поднимется.
Записан
alexis031182
Гость
« Ответ #5 : Март 07, 2013, 22:16 »

Вы разделяете HTTP и WebSockets между собой, что наверное не совсем верно с учётом того, что Вам нужно сохранить однажды открытое соединение. Это означает, что Ваш сервер веб-сокетов должен быть одновременно и http-сервером.
Записан
RedDog
Гость
« Ответ #6 : Март 07, 2013, 22:56 »

Внезапно пришла такая мысль:
повесить свой Qt WebSocket сервер на локальный порт, т.е.  что то типа такого:
Код:
QTcpServer::listen(QHostAddress::LocalHost, 9999);
А http сервер настроить, что бы он адрес https://SomeHost принимал на себя, а адрес https://SomeHost/websocket проксировал на свой локалхост на порт 9999. Тогда половина вопроса будет решена (торчать в сеть ничего лишнего не будет).
Остается только выяснить, может ли какой либо веб-сервер (который поддерживает еще к тому же FastCGI) пробрасывать таким макаром соединение.
Записан
alexis031182
Гость
« Ответ #7 : Март 07, 2013, 22:59 »

nginx наверное может.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 20.