В настоящем разделе описана версия сервера Chatbot::Eliza, в которой применяется мультиплексирование. Она может служить иллюстрацией того, как работает типичный мультиплексный сервер. Основной принцип действия этого сервера соответствует следующей общей схеме. 1) Создание приемного сокета.
2) Создание набора дескрипторов IO::Select и добавление приемного сокета к списку сокетов, контролируемых для определения готовности для чтения.
3) Переход к выполнению цикла select ().
4) После возврата из цикла select () проверка списка сокетов, готовых для чтения. Если в их число входит приёмный сокет, выполняется вызов функций accept ( ) и добавление результирующего подключенного сокета к набору дескрипторов IO::Select.
5) Если для чтения готовы другие сокеты, осуществляется выполнение в них операции ввода-вывода.
6) Удаление сокетов клиентских соединений из набора дескрипторов IO::Select по мере завершения их выполнения.
В данной версии сервера Eliza показано, как эта схема реализуется на практике.
Главная программа сервера.
Новый сервер eliza_select.pl состоит из главной части и модуля Chatbot::Eliza::Polite, который образует подкласс класса Chatbot::Eliza.
Такое значительное изменение проекта по сравнению с предыдущими версиями сервера связано с необходимостью разбить на две части метод command_interfасе () объекта Chatbot::Eliza. Дело в том, что метод command_interface ( ) имеет собственный цикл ввода-вывода, который не освобождает соединение до тех пор, пока не завершится диалог с клиентом. Этого нельзя позволить, поскольку такая организация работы приводит к блокировке других клиентов.