Подается в одно мгновение

Написание Perl-сервера

Подается в одно мгновение

Базовую структуру Perl-сервера можно прочитать на страницах руководства, и мы использовали ее для основного кода ниже, хотя мы добавили несколько дополнительных фрагментов, чтобы улучшить его структуру:

use Net:: OSCAR qw(:standard); use strict; use constant USERNAME => 'realworldoss '; use constant PASSWORD => 'password'; sub im_in($$$$) { my($oscar, $sender, $message, $is_away) = @_; print "[AWAY] " if $is_away; print "$sender: $message "; } my $oscar = Net:: OSCAR->new(); $oscar->set_callback_im_in(\&im_in); $oscar->signon(USERNAME, PASSWORD ); while(1) { $oscar->do_one_loop(); sleep 1; } 

Здесь есть четыре блока кода, которые стоит рассмотреть более подробно. В первом говорится, что мы хотим использовать два расширения Perl, первое из которых — Net:: OSCAR (аргумент qw :standard означает, что мы также получаем некоторые определения констант, которые могут быть полезны). Оператор use strict делает интерпретатор Perl строгим в отношении синтаксиса и, в частности, проверяет, были ли объявлены переменные перед использованием. Второй блок вводит две константы для имени пользователя и пароля AIM; Хотя это и не обязательно, хорошей практикой является использование именованных констант вместо строковых литералов.

Третий блок определяет функцию под названием «im_in», которая принимает четыре аргумента (как показано четырьмя знаками $). Следующая строка показывает, как аргументы обрабатываются в Perl. Если вы хотите знать, что это значит и как это можно изменить, прочитайте книгу. Следующие строки выводят некоторые результаты.

Последний блок кода является основной программой: сначала он создает объект Perl с именем $oscar класса Net:: OSCAR, который реализует для вас весь протокол OSCAR, входя на сервер и обрабатывая все входящие и исходящие сообщения сервер. Чтобы вам не нужно было знать, как на самом деле работает протокол, следующая строка регистрирует функцию обратного вызова с объектом Net:: OSCAR, которую он вызывает всякий раз, когда обнаруживает, что произошло какое-то событие. В этом случае наша функция im_in распечатывает входящее сообщение. Следующая строка запрашивает вход на сервер AIM, затем переходит в бесконечный цикл для обработки сообщений OSCAR, каждый раз приостанавливаясь на одну секунду.

Обратите внимание, что функция входа не подписывает вас на AIM немедленно, а просто запускает процесс, который будет обрабатываться внутри цикла – для фактического достижения может потребоваться много итераций цикла. авторизоваться. Чтобы увидеть, что происходит, вам нужна некоторая отладочная информация, и чтобы получить ее, вы можете изменить первый оператор «use Net:: OSCAR» следующим образом:

use Net:: OSCAR qw(:standard :loglevels); and add the line: $oscar->loglevel(OSCAR_DBG_NOTICE); When you run the Perl script with the correct password, you'll see the following logged output: login: Connecting to login.oscar.aol.com: 5190. login: Connected. login: Connected to login server. login: Sending password. login: Login OK - connecting to BOS basic OSCAR service: Connecting to 64.12.24.192:5190. login: Closing. basic OSCAR service: Connected. basic OSCAR service: Sending BOS-Signon. basic OSCAR service: BOS handshake complete! basic OSCAR service: Signon BOS handshake complete! OSCAR session: Setting user information. You can now send a message that gets printed out as: [email protected]: Hello world

Прежде чем идти дальше, необходимо внести некоторые улучшения. Во-первых, нам нужно иметь возможность обрабатывать такие ошибки, как неверные пароли, поэтому мы определяем новую функцию под названием «handle_error»:

sub handle_error($$$$$) {

my($oscar, $connection, $error, $description, $fatal) = @_;