3-х сторонняя связь через сокеты - PullRequest
4 голосов
/ 20 августа 2010

Добрый день, Гуру,

Я довольно хорошо знаком с базовым программированием сокетов и модулем IO :: Socket, но теперь мне нужно кое-что написать, с чем я раньше не сталкивался. Это будет 3-х уровневое приложение. Первый уровень - это цикл обработки событий, который отправляет сообщения в восходящем направлении при обнаружении определенных событий. Второй уровень - это сервер промежуточного программного обеспечения, который (помимо прочего) выступает в качестве хранилища сообщений. Третий уровень - это приложение cgi, которое будет обновлять графический дисплей.

Я не совсем понимаю, как настроить сервер на прием однонаправленных соединений от нескольких клиентов, с одной стороны, и на двустороннюю связь с приложением cgi, с другой. Я могу выполнить любую из этих задач отдельно, но не в том же сценарии (пока). Мой вопрос имеет смысл? Я хотел бы использовать модуль IO :: Socket, но это не является обязательным требованием. Я не прошу отшлифованный код, просто совет по настройке сокета (ов) и как общаться от одного клиента к другому через сервер.

Кроме того, имеет ли смысл делать так, чтобы приложение cgi запрашивало у сервера новые сообщения или сервер отправлял новое сообщение перед приложением cgi? Графические обновления должны быть в режиме реального времени.

Заранее спасибо,

Дарен

Ответы [ 2 ]

5 голосов
/ 21 августа 2010

Вы сказали, что у вас уже есть цикл событий на первом уровне. В некотором смысле, ваш сервер второго уровня должен также организовать некоторый цикл обработки событий для асинхронной обработки. Есть много способов закодировать его, используя perl, например AnyEvent, POE, Event и многие другие. В конце концов, все они используют одно из средств select, poll, epoll, kqueue ОС (или их эквивалент в Windows). Если вы чувствуете себя комфортно при кодировании на относительно низком уровне, вы можете просто использовать встроенный в perl select или, альтернативно, его объектно-ориентированный аналог, IO::Select.

По сути, вы создаете два прослушивающих сокета (вам может понадобиться только один, если первый уровень использует тот же протокол связи, что и третий уровень для связи с вашим сервером), добавьте его к объекту IO::Select и сделайте выборку на нем. После подключения сделано, добавляешь принятые сокеты в выделенный объект. Метод select для IO::Select вернет вам список сокетов, готовых для чтения или записи (я игнорирую возможность исключений здесь). Конечно, вы должны следить за своими сокетами, чтобы знать, какой из них какой. Кроме того, логика связи будет несколько сложной, потому что у вас есть для использования неблокирующих сокетов.

Что касается второй части вашего вопроса, меня немного смущает то, что вы подразумеваете под "cgi" - будь то общий интерфейс шлюза (т. Е. Веб-сценарии на стороне сервера) или это сокращение для "компьютерная графика". В обоих случаях я думаю, что для вашей задачи имеет смысл использовать серверный push. В последнем случае это все, что я хотел бы сказать. В первом случае я предлагаю вам Google для «Комета» (как в «AJAX»). : -)

0 голосов
/ 21 августа 2010

В стандартном приложении CGI я не вижу, как вы можете «проталкивать» данные в них.Для взаимодействия с клиентом данные проходят через уровень CGI / представления на средний уровень, чтобы оставаться в хранилище сеанса (или кеше) или в бэкэнд для хранения в базе данных.

Это, конечно, если у вас нет толстого прикладного слоя, который является локусом кэширования и сам по себе является чем-то вроде среднего уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...