Изучаем Perl

       

Клиент webget



Клиент webget

Вот простой клиент, который устанавливает соединение с удаленным сервером и получает с него список документов. Этот клиент интереснее предыдущего, потому что перед получением ответа сервера он посылает на него строку данных.

#!/usr/bin/peri -w use 10::Socket;

unless (@ARGV > 1) ( die "usage: $0 host document ..." } $host = shift (OARGV);

foreach $document ( OARGV ) (

$remote == 10::Socket::INET->new( Proto => "tcp",

PeerAddr => $host,

PeerPort => "http (80)",

);

unless ($remote) ( die "cannot connect to http daemon on $host" )

$remote->autoflush(l) ;

print $remote "GET $document HTTP/I.0\n\n";

while ( <$remote> ) ( print )

-close $remote;

)

Подразумевается, что Web-сервер, на котором работает сервис http, использует свой стандартный порт (номер 80). Если сервер, с которым вы пытаетесь установить соединение, использует другой порт (скажем, 8080), то в качестве третьего аргумента конструктора new () нужно указать PeerPort => 8080. При работе с этим гнездом применяется метод autoflush, потому что в противном случае система буферизировала бы выходную информацию, которую мы ей передали. (Если у вас компьютер Macintosh, то нужно заменить все \п в коде, предназначенном для передачи данные по сети, на



\015\012.)

Соединение с сервером — это лишь первый этап процесса: установив соединение, вы должны начать говорить на языке этого сервера. Каждый сервер сети использует свой собственный маленький командный язык, и входные данные, подаваемые на сервер, должны быть сформулированы именно на этом языке. Начинающаяся словом GET строка, которую мы послали серверу, соответствует синтаксису протокола HTTP. В данном случае мы просто запрашиваем каждый из указанных документов. Да, мы действительно создаем новое соединение для каждого документа, несмотря на то, что это тот же самый хост. Именно так функционирует НТТР-серевер. (Последние версии Web-броузеров могут требовать, чтобы удаленный сервер оставлял соединение открытым на некоторое время, но сервер не обязан удовлетворять такой запрос.)

Мы назовем нашу программу webget. Вот как ее можно было бы выполнить:

shell prompt? webget www.peri.com /guanaco.html

HTTP/I.I 404 File Not Found

Date: Thu, 08 May 1997 18:02:32 GMT

Server: Apache/1.2b6

Connection: close

Content-type: text/html

<HEADXTITLE>404 File Not Found</TITLEX/HEAD>

<BODYXHl>File Not Found </H1>

The request URL /guanaco.html was not found on this server. <P>

</BODY>

Это, конечно, не очень интересно, потому что программа не нашла конкретный документ, однако длинный ответ не поместился бы на этой странице.

Чтобы ознакомиться с более развитой версией данной программы, вам нужно найти программу Iwp-request, входящую в состав модулей LWP из CPAN. (LWP мы вкратце рассмотрели в конце главы 19.)



Содержание раздела