чат-приложение ruby ​​on rails через порт 80, на котором размещен сайт, не зависящий от сайта (без флэш-памяти и веб-сокетов)

Хотел создать приложение, похожее на чат (т.е. двунаправленную передачу сообщений нескольким подключенным клиентам). Посмотрел гем Faye, но он открывает новый порт, кроме порта 80.

Большая проблема заключается в том, что если клиент находится за брандмауэром, доступ к другим портам, кроме 80, ограничен, и не все хостинги предоставляют поддержку.

Компонент ActionController::Live не имеет механизма для регистрации клиентов, чтобы сообщение не могло быть передано зарегистрированным клиентам при возникновении определенного события.

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


person Talespin_Kit    schedule 14.01.2014    source источник
comment
Попробуйте использовать для этого сокеты — они обеспечивают вам полную гибкость. Однако я не уверен, что использование порта 80 является хорошей идеей - он зарезервирован для протокола www http.   -  person BroiSatse    schedule 14.01.2014
comment
Ой, подождите минутку, вы хотите, чтобы это было приложение ruby ​​on rails — так вы хотите, чтобы это было и веб-приложение, и чат на одном и том же порту?   -  person BroiSatse    schedule 14.01.2014
comment
Точно. Спасибо за понимание.   -  person Talespin_Kit    schedule 14.01.2014
comment
Я не уверен, возможно ли это вообще - чтобы общаться в реальном времени, вам нужно установить стабильное соединение через указанный порт. Порт 80 будет обслуживаться веб-сервером, который, насколько мне известно, его не поддерживает. Лучшее, что вы можете сделать, это какой-нибудь чат на основе ajax, где браузер будет отправлять мини-запросы на сервер каждые две секунды и получать самые последние сообщения с сервера в качестве ответа.   -  person BroiSatse    schedule 14.01.2014
comment
Ах, в конце концов вы можете подумать об использовании push-state, представленного в html5. Ресурсов не так много, но вы можете взглянуть на jquery-pjax gem. Обратите внимание, что ваш сервер должен поддерживать функцию push_state.   -  person BroiSatse    schedule 14.01.2014


Ответы (2)


Хороший вопрос - реализовав нечто подобное, позвольте мне объяснить, как это работает:


Подключения

«Живое» веб-приложение на самом деле вовсе не «живое» — оно просто получило постоянный запрос; это означает, что оно по-прежнему работает точно так же, как «обычное» приложение Rails, за исключением того, что клиенты не закрывают соединение (поэтому вы заинтересованы в открытии другого порта)

В том, как вы обрабатываете запрос, происходит волшебство. Это касается как клиентской части, так и Rails (серверной).


Клиенты

Когда вы подключаетесь к приложению «чат», ваш браузер открывает живое соединение с сервером. Обычно это делается с помощью событий, отправленных сервером (длительный опрос Ajax), или веб-сокеты

Это работает так: для открытия соединения используется обычное промежуточное ПО Rails ActionDispatch и затем разрешите вам подключиться

Если вы играли с функциональностью ActionController::Live, вы обнаружите, что это не типичное действие контроллера. На самом деле это отдельная технология (например, resque или Redis), который вы вызываете из другого действия контроллера. Это дает возможность делать классные вещи с


Сервер

То, как вы справитесь с чем-то подобным, состоит в том, чтобы разделить «живую» функциональность и «обычное» приложение Rails. Это один из текущих недостатков Rails — в этом, вероятно, лучше что-то реализовать например, nodeJS с socket.io для обработки данных в реальном времени (с конечной точкой, такой как chat.yourapp.com), в то время как использование Rails для обработки аутентификации и авторизации

С точки зрения сервера, его работа заключается в обработке входящих и исходящих запросов, а не в обработке постоянных соединений. Поэтому я думаю, вы можете посмотреть, как вы могли бы «аутсорсить» подключение к веб-сокету. По общему признанию, мой опыт в этой области немного скуден, так что вы можете хорошо поискать в сети.


Решения

Мы успешно использовали стороннюю систему под названием Pusher.

Это система веб-сокетов, которая позволяет вам открывать постоянное соединение в качестве клиента и интегрируется с Rails аналогично Redis (вы можете нажать на нее).

Это означает, что вы можете размещать приложение «чат» с помощью Rails (http://yourapp.com/chat), отправлять сообщения в свое приложение Rails (http://yourapp.com/chat/send) и обрабатывать входящие чаты от отправителя (или аналогичного)

person Richard Peck    schedule 14.01.2014
comment
:- Веб-сокеты нельзя использовать, так как все клиенты будут веб-просмотром Android (не поддерживают веб-сокеты), поэтому Pusher не вариант. - person Talespin_Kit; 14.01.2014
comment
Вам нужно будет как-то открыть постоянное соединение. Rails не может этого сделать без клиентской поддержки. - person Richard Peck; 14.01.2014
comment
Это не проблема (клиенты могут сделать xmlhttprequest). Но проблема заключается в реализации веб-сокетов со стороны клиента. А пушер — платный продукт, что не проблема. Но не готовы (| стоит) платить за идею, которая еще не проверена. Ищу бесплатное решение - person Talespin_Kit; 14.01.2014
comment
Пушер бесплатен для определенного уровня!! Я бы определенно попробовал Pusher, но я не уверен в поддержке веб-просмотра Andoid, как вы упомянули. - person Richard Peck; 14.01.2014

Возможно, вы хотите использовать мой веб-сервер кометы с открытым исходным кодом (https://github.com/TorstenRobitzki/Sioux ). Вот пример рубинового веб-чата. Я использую это для реализации интерактивной ролевой карты с рельсами (http://dungeonpilot.com).

person Torsten Robitzki    schedule 14.01.2014
comment
dungeonpilot.com выглядит круто. Точно пытаюсь создать такое приложение. Но не уверен, что это независимый от сервера хостинг. Кто является хостинг-провайдером dungeonpilot.com? - person Talespin_Kit; 14.01.2014
comment
Вам нужен доступ к вашему собственному серверу. Dungeonpilot размещается на aws/ec2. - person Torsten Robitzki; 14.01.2014