Опубликован: 17.08.2006 | Доступ: свободный | Студентов: 5372 / 697 | Оценка: 4.49 / 3.94 | Длительность: 20:58:00
ISBN: 978-5-9556-0078-9
Лекция 17:

Работа в IP-сетях

< Лекция 16 || Лекция 17: 123 || Лекция 18 >

Передача файлов

Во Всемирной сети Интернет насчитывается огромное количество файловых серверов, где хранятся архивы программ, документация и другая информация. FTP (File Transfer Protocol) - это протокол, специально созданный для передачи файлов. Обмен файлами остается одной из постоянных задач сетевого программирования, которая легко решается средствами языка Perl. В поставке Perl имеется стандартный модуль Net::FTP, реализующий FTP-клиента, который позволяет весьма просто организовать обмен файлами с сервером по протоколу FTP - например, автоматизировать обновление нужных файлов с сервера. Далее приводится программа, которая с помощью команд FTP загружает с сервера файл, если он имеет более позднее время изменения, чем его локальная копия:

use Net::FTP; # используем модуль работы с FTP 
my $server = 'ftp.server.org';   # имя или адрес сервера 
my $file   = 'file.name';        # имя файла

my $ftp = Net::FTP->new($server) # соединяемся с сервером 
   or die "Ошибка соединения с $server:$@";
$ftp->login('ftp','ftp')         # указываем имя и пароль 
   or die " Ошибка регистрации:", $ftp->message;
$ftp->cwd("/pub")                # переходим в каталог
   or die "Ошибка смены каталога:", $ftp->message;
my $time_ftp = $ftp->mdtm($file) # время изменения на сервере
   or die;
my $time_old = (stat($file))[9]; # время создания копии

if ($time_ftp > $time_old) { # если файл на сервере новее,
   $ftp->binary;                 # то в двоичном режиме 
   $ftp->get($file)              # загружаем файл
      or die "Ошибка загрузки: ", $ftp->message;
   utime($time_ftp, $time_ftp, $file); # и меняем время файла
}
$ftp->quit;                      # заканчиваем сеанс связи

Поскольку в классе Net::FTP реализованы остальные команды протокола FTP, с его помощью можно разрабатывать гораздо более сложные программы файлового обмена. Кроме этого класса, в архивах CPAN можно найти много других модулей для обмена файлами с FTP-серверами.

Электронная почта

Электронная почта (e-mail) была и остается одним из самых популярных сетевых сервисов. Электронная почта базируется на асинхронной доставке почтового сообщения (message) с одного почтового сервера на другой с помощью протокола SMTP (Simple Mail Transfer Protocol). Почтовые сообщения каждого пользователя хранятся на сервере в отдельном почтовом ящике (mail-box). Клиентская почтовая программа (Mail User Agent, MUA) забирает почту с сервера с помощью одной из версий протокола POP (Post-Office Protocol) или предоставляет пользователю непосредственный доступ к ящику на почтовом сервере с помощью протокола IMAP (Internet Mail Access Protocol).

Естественно, что в Perl имеется множество средств работы с электронной почтой. По электронной почте можно организовать автоматическое уведомление системных администраторов или пользователей о наступлении определенного события. С помощью сообщений электронной почты организуется регулярная автоматическая рассылка информации, например, счетов клиентам. При работе с почтой можно воспользоваться стандартными модулями - Net::SMTP для отправки сообщений и Net::POP3 для их получения. Приведем пример простой программы, отправляющей сообщение электронной почты:

use Net::SMTP; # используем класс для отправки e-mail 
my $mail_server = 'shokhirev.com';         # почтовый сервер
my $to_user     = 'mikhail@shokhirev.com'; # получатель
my $from_user   = 'mshock@shadrinsk.net';  # отправитель

$smtp = Net::SMTP->new(Host=>$mail_server);# соединяюсь
$smtp->mail($from_user);                   # пишу
$smtp->to($to_user);                       # получателю
$smtp->data();                             # письмо
$smtp->datasend("To: $to_user\n");         # 
$smtp->datasend("Subject: Lectures on Perl 5\n");
$smtp->datasend("\n");
$smtp->datasend("Сообщаем о публикации на intuit.ru\n");
$smtp->datasend("курса лекций по Perl 5\n");
$smtp->dataend();                          # заканчиваю
$smtp->quit;                               # отсоединяюсь

Если нужно в программе проверить почтовый ящик на сервере, то с помощью класса Net::POP3 не составит труда написать короткую программу, принимающую электронную почту. Например, такую:

use Net::POP3; # используем класс для получения e-mail 
my $mail_server = 'shadrinsk.net';      # почтовый сервер
my $user        = 'mshock';             # почтовый ящик
my $password    = 'secret';             # пароль

$pop = Net::POP3->new($mail_server);    # подключаюсь
if ($pop->login($user, $password) > 0) {# регистрируюсь
   my $numbers = $pop->list;            # получаю номера писем 
   foreach my $numbers (keys %$numbers) {# по номеру
      my $message = $pop->get($numbers); # получаю письмо
      print @$message;                  # печатаю его
      $pop->delete($numbers);            # удаляю с сервера
   }
}
$pop->quit;                             # отсоединяюсь

На серверах CPAN есть множество программ для работы с электронной почтой, включая серверы. На Perl написана свободно распространяемая почтовая система с web-интерфейсом Open WebMail (openwebmail.org). На нем же написана и одна из самых известных и эффективных серверных систем фильтрации спама - SpamAssassin.

Системы обмена сообщениями

Системы мгновенного обмена сообщениями (instant messaging), иногда также называемые Интернет-пейджерами, получили огромное распространение: миллионы людей ежедневно общаются с помощью ICQ, Jabber, AOL Instant Messenger или Yahoo!Messenger. В архивах на сайте CPAN можно найти Perl-модули для работы со всеми этими системами. Хотя этот обмен сообщениями ориентирован на взаимодействие людей, его можно использовать для программного извещения пользователя о каком-либо событии. Для примера напишем программу, отправляющую сообщение с использованием открытого протокола мгновенного обмена сообщениями XMPP/Jabber (дополнительный модуль Net::Jabber нужно установить из архива CPAN). В примере после соединения с Jabber-сервером отправляется сообщение пользователю, а после получения от него ответа работа завершается:

use Net::Jabber; # подключаем класс работы с Jabber 
use utf8;        # в Jabber используется UTF-8 
my $server   = 'jabber.shadrinsk-city.ru'; # сервер
my $port     = 5222;               # порт
my $username = 'perl';             # отправитель
my $password = 'password';         # его пароль
my $resource = 'jud';              # ресурс
my $to_user  = 'mshock@jabber.ru'; # получатель 

my $client = new Net::Jabber::Client(); # создаем клиента
$client->SetCallBacks(   # указываем обработчики событий:
   onconnect => \&on_connect, # при подключении
   onauth    => \&on_auth,    # при регистрации
   message   => \&on_message, # при получении сообщения
);
$client->Execute(             # соединяемся с сервером
   hostname=>$server,   port=>$port,
   username=>$username, password=>$password,
   resource=>$resource, register=>1,
   connectsleep=>0,     connectattempts=>1,        
);
# завершение программы произойдет в on_message
sub on_connect { # выполнится при подключении к серверу
   print "Подключен к $server:$port\n";
}
sub on_auth { # выполнится при регистрации на сервере
   print "Зарегистрирован как $username\n";
   $client->MessageSend(      # ОТПРАВЛЯЕМ СООБЩЕНИЕ
      to=> $to_user. '/' .$resource,
      subject=>'сообщение от Perl',
      body=>'Привет, Jabber!'
   );
}
sub on_message { # выполнится при получении сообщения 
   my $sid = shift;           # извлекаем номер и текст
   my $message = shift;       # ответа и выводим его:
   print "Тема:", $message->GetSubject(), "\n";
   print "Сообщение:", $message->GetBody(), "\n";
   $client->Disconnect();     # отключаемся от сервера
   exit(0);                   # и завершаем работу
}

В этом примере демонстрируется прием программирования, распространенный при работе в многозадачной среде: главная программа организует бесконечный цикл обработки событий, для реагирования на которые вызываются обработчики событий. Конечно, помимо обмена сообщениями Jabber предоставляет целый набор средств для полноценного общения, а Perl дает возможность работать с ними.

Есть примеры использования Perl для разработки шлюзов между IP-сетями и беспроводными сетями. На Perl написан свободно распространяемый пейджинговый шлюз Sendpage (www.sendpage.org). Класс Net::SNPP занимается отправкой сообщений на пейджер по протоколу SNPP (Simple Network Paging Protocol), а модуль Net::SMS служит для работы со службой SMS-сообщений для клиентов GSM-телефонии. Теперь мало кого удивляет, что вскоре после появления очередной новой технологии передачи данных на CPAN выкладываются Perl-модули для работы с ней.

< Лекция 16 || Лекция 17: 123 || Лекция 18 >
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Галина Башкирова
Галина Башкирова

Здравствуйте, недавно закончила курс по проф веб программиованию, мне прислали методические указания с примерами тем, однако темы там для специальности 

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам