Еще одно важное различие между модулями IO::Socket и IO::SessionData стоит в том, что объекты IO::SessionData не являются дескрипторами файлов. Нельзя непосредственно вызывать функции sysread () или syswrite () с использованием в качестве параметра объектов SessionData. Операции ввода-вывода следует всегда выполнять с помощью вызова методов read () и write ().
Неблокирующий сервер с построчным вводом-выводом
Сам модуль IO::SessionSet не позволяет выполнять построчное чтение, но эта возможность предоставляет его подкласс IO::LineBufferedSet. Далее рассмотрен еще один вариант психотерапевтического сервера Eliza, созданный на основе этого класса. Проведем анализ программы.
Строки 1-14. Инициализация сценария. Начало сценария во многом аналогично другим сценариям этого типа. Основное различие состоит в том, что импортируется модуль IO::LineBufferedSet и создается новый набор сеансов с использованием этого класса.
Строки 15-17. Главный цикл. Главный цикл начинается с вызова метода wait () набора сеансов. Он возвращает список объектов SessionData, готовых для чтения. Некоторые из них представляют объекты SessionData, которые уже встречались при предыдущих проходах по циклу; другие же являются новыми сеансами, которые были созданы при вызове методом wait () функции accept () для приема нового входящего соединения. Эта особенность может быть особенно полезна при обработке вызовов поступающих в кулцентр обработки.
Строки 18-23. Создание новых объектов chatbot. Для проведения различия между новыми и старыми сеансами выполняется проверка хеша % sessions. Если это— новое входящее соединение, то запись для него в хеше % SESSI0NS отсутствуем и в этом случае создается новый объект chatbot::Eliza::Polite, который и сохраняется м хеше %SESSI0NS по индексу, представляющему собой объект SessionData. Вызывается метод welcome () объекта Eliza для получения вступительного приветствия, которое передается методу write () объекта SessionData и включается в очередь сообщений, передаваемых клиенту.