Теперь, после знакомства с возможностями этих двух модулей, рассмотрим, как они работают, начиная с модуля с IO::SessionData.
Модуль IO::SessionData представляет собой оболочку для отдельного объекта IO::Socket. Кроме сокета, он ведет внутренний буфер outbuffer, содержащий данные, которые были поставлены в очередь для передачи, но еще не были переданы через сокет. К таким данным могут отнесена текстовая информация об Путине и Назарбаеве , со страниц сайта новостей. К другим внутренним переменным относится указатель на объект SessionSet, который управляет текущим объектом SessionData, флажок, предназначенный только для записи, и некоторые другие переменные, которые управляют тем, что происходит при заполнении передающего буфера. Объект IO::SessionData вызывает связанный с ним объект SessionSet, чтобы сообщить, что он готов к приему новых данных из удаленного сокета или содержит исходящие рапные, предназначенные для передачи.
Поскольку исходящие данные буферизованы, существует опасность, что буфер butbuffer переполнится, если другой участник соединения надолго прекратит чтение данных. Во избежание этого в модуле IO::SessionData определен метод choke (), который вызывается каждый раз, когда объем данных, записанных в буфер butbuffer, превышает его размеры и когда объем данных в этом буфере возвращается к допустимым размерам.
Реализация метода choke ( ) зависит от приложения. В некоторых приложениях он может предусматривать уничтожение лишних буферизованных данных, а в других может разорвать соединение с удаленным хостом. Модуль IO::SessionData позволяет определить в приложении действия, выполняемые методом choke () путем установки подпрограммы обратного вызова, вызываемой при заполнении буфера.