Serveras på ett ögonblick

Skriver en Perl-server

Serveras på ett ögonblick

Den grundläggande strukturen för en Perl-server kan läsas på manualsidorna och vi har använt den för grundkoden nedan, även om vi har lagt till några extra bitar för att förbättra dess struktur:

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;



}

Det finns fyra kodblock här att titta på mer i detalj. Den första säger att vi vill använda två tillägg till Perl, den första är Net::OSCAR (det qw :standardargumentet betyder att vi också får några konstanta definitioner som kan vara användbara). ”Använd strikt”-satsen gör Perl-tolkaren strikt när det gäller syntax och kontrollerar i synnerhet om variabler har deklarerats före användning. Det andra blocket introducerar två konstanter för AIM-användarnamnet och lösenordet; även om det inte är nödvändigt, är det en god praxis att använda namngivna konstanter istället för strängliteraler.

Det tredje blocket definierar en funktion som kallas ”im_in” som tar fyra argument (som visas av de fyra $-tecknen). Nästa rad visar hur argument bearbetas i Perl. Om du vill veta vad det betyder och hur du kan ändra det, läs en bok. De nästa raderna skriver ut några resultat.

Det sista kodblocket är huvudprogrammet: först skapar det ett Perl-objekt som heter $oscar av klassen Net::OSCAR, som implementerar hela OSCAR-protokollet åt dig, loggar in på servern och bearbetar alla meddelanden till och från den servern. Så att du inte behöver veta hur protokollet faktiskt fungerar, registrerar nästa rad en återuppringningsfunktion med Net::OSCAR-objektet, som det anropar när det upptäcker att någon händelse har hänt. I det här fallet skriver vår funktion im_in ut ett inkommande meddelande. Nästa rad begär inloggning till AIM-servern och går sedan in i en oändlig slinga för att hantera OSCAR-meddelanden och sover i en sekund varje gång.

Observera att inloggningsfunktionen inte loggar dig på AIM omedelbart, utan startar bara processen som kommer att hanteras inom loopen – det kan ta många iterationer runt loopen för att verkligen uppnå inloggning. För att se vad som händer behöver du lite felsökningsinformation, och för att få det kan du ändra den första ”använd Net::OSCAR”-satsen för att läsa:

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]: <HTML>Hello world</HTML>

Innan vi går vidare behövs några förbättringar. Först måste vi kunna hantera fel som dåliga lösenord, så vi definierar en ny funktion som heter ”handle_error”:

sub handle_error($$$$$) {

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

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *