Pokaż wyniki 1 do 7 z 7

Temat: Serwer HTTP Perl

  1. #1
    Zarejestrowany
    Jun 2009
    Skąd
    Wrocław
    Postów
    6

    Domyślnie Serwer HTTP Perl

    Ja mam "problem" z Perlem. Próbowałem się dziś nauczyć podstaw i nie jest źle, bo już umiem uruchamiać programy Przymusiło mnie zadanko z technologii sieciowych.



    Kod:
    use HTTP::Daemon;
      use HTTP::Status;  
      #use IO::File;
    
      my $d = HTTP::Daemon->new(
               LocalAddr => 'lukim',
               LocalPort => 4321,
           )|| die;
      
      print "Please contact me at: <URL:", $d->url, ">\n";
    
    
      while (my $c = $d->accept) {
          while (my $r = $c->get_request) {
              if ($r->method eq 'GET') {
                  
                  $file_s= "./index.html";    # index.html - jakis istniejacy plik
                  $c->send_file_response($file_s);
    
              }
              else {
                  $c->send_error(RC_FORBIDDEN)
              }
    
          }
          $c->close;
          undef($c);
      }
    Pytanie, jak to działa i dlaczego przy uruchomieniu wyskakuje błąd:
    (nie, żebym nie rozumiał po angielsku, ale jaki powinien być ten adres?)

    Jeśli Ktoś chciałby wytłumaczyć, jak mam zacząć i jak nawiązać połączenie za pomocą klientów i co powinien zawierać plik index.html... Byłbym bardzo wdzięczny

    Jeszcze klienci:
    Kod:
    use LWP::Simple;
    
     $content = get("http://www.chip.pl/");
     die "Couldn't get it!" unless defined $content;
     
    print $content;
    Kod:
     use LWP::UserAgent;
      $ua = LWP::UserAgent->new;
      #$ua->agent("$0/0.1 " . $ua->agent);
    
      $ua->agent("Mozilla/8.0"); # pretend we are very capable browser
    
      $req = HTTP::Request->new(GET => 'http://www.chip.pl');
      $req->header('Accept' => 'text/html');
    
      # send request
      $res = $ua->request($req);
    
      # check the outcome
      if ($res->is_success) {
         print $res->content;
      }
      else {
         print "Error: " . $res->status_line . "\n";
      }
    Kod:
    use LWP::UserAgent;
      $ua = LWP::UserAgent->new;
      #$ua->agent("$0/0.1 " . $ua->agent);
    
      $ua->agent("Mozilla/8.0"); # pretend we are very capable browser
    
      $req = HTTP::Request->new(GET => 'http://www.google.pl/search?q=doom');
      $req->header('Accept' => 'text/html');
    
      # send request
      $res = $ua->request($req);
    
      # check the outcome
      if ($res->is_success) {
         print $res->content;
      }
      else {
         print "Error: " . $res->status_line . "\n";
      }
    Z góry dziękuję za wszelkie wskazówki.

  2. #2
    Zarejestrowany
    Nov 2006
    Skąd
    Polska/Poland
    Postów
    1,191

    Domyślnie

    Błąd jest bo jak napisałem wstaw adres IP:
    127.0.0.1 najlepiej na początek lub odwzoruj sobie w pliku hosts te nazwe (lukim) na adres swojej karty sieciowej.
    To robi tak, że słucha w pętli na zadanym adresie i porcie by odbierać prawidłowe żądania HTTP wysłane na ten socket i serwować ewentualne pliki.
    W tym wypadku obsługą protokołu zajmuje się
    LINK

    i co powinien zawierać plik index.html...
    nie chcę Ciebie zniechęcać ale jak stawiasz takie pytanie to chyba za wcześnie jeszcze na zabawę perlem na poziomie sieci i socketów ale mogę się mylić.
    ***********
    * markossx *
    ***********

  3. #3
    Zarejestrowany
    Jun 2009
    Skąd
    Wrocław
    Postów
    6

    Domyślnie

    Cytat Napisał markossx Zobacz post
    nie chcę Ciebie zniechęcać ale jak stawiasz takie pytanie to chyba za wcześnie jeszcze na zabawę perlem na poziomie sieci i socketów ale mogę się mylić.
    Z pewnością jest za wcześnie Tym bardziej, że informatyka to nie jest mój życiowy konik

    Dobra to tak. Wrzuciłem sobie do folderu bierzącego jakąś stronkę index.html (mam nadzieję, że o to tylko chodzi i nic tam więcej nie musi być). Zmieniłem adres na swoje IP (znaczy domyślne). uruchomiłem w konsoli ten serwer. Odpaliłem operę i próbowałem się połączyć wpisując http://127.0.0.1:4321/ ale
    Nie uzyskano połączenia z serwerem
    .
    Jestem na dobrej drodze?

    // Poprawka, nie zauważyłem błędu w konsoli
    HTTP:aemon: Bad hostname '⌂ ☺' ...propagated at server3.pl line 5.
    Ostatnio edytowane przez cossinuss : 06-03-2009 - 13:32

  4. #4
    Zarejestrowany
    Nov 2006
    Skąd
    Polska/Poland
    Postów
    1,191

    Domyślnie

    Dobrze kombinujesz
    Wyeliminuj błąd i odpal serwer.
    Jak się serwer odpali to powinieneś mieć stan LISTEN na porcie 4321.
    Sprawdź:
    windows:
    Kod:
    netstat -anob
    linux:
    Kod:
    netstat -vatn
    btw:
    looknij tez czy firewall nie blokuje czegoś.
    ***********
    * markossx *
    ***********

  5. #5
    Zarejestrowany
    Jun 2009
    Skąd
    Wrocław
    Postów
    6

    Domyślnie

    Czas wrócić do zadania. Może komuś zechce się jeszcze potłumaczyć mi jak krowie na rowie .

    Proszę o weryfikację moich rozważań:

    Kod:
    use HTTP::Daemon;
      use HTTP::Status;
      use IO::File;
    
    
    
      # metoda new tworzy serwer
      # jesli nie uda się utworzyć Deamona to die. Kiedy może zajść taka sytuacja ??
      my $d = HTTP::Daemon->new(
               LocalAddr => 'lukim',
               LocalPort => 4322,
           )|| die;
    
      # $d->url zwraca adres serwera
      print "Please contact me at: <URL:", $d->url, ">\n";
    
      # accept "zwraca domyślnie wskaźnik do HTTP::Daemon::ClientConn"
        while (my $c = $d->accept) {
    
          # nasłuchiwanie
          while (my $r = $c->get_request) {
    
              # z HTTP::Request coś pobiera... :)
              if ($r->method eq 'GET') {
    
                  # czytamy stronkę do stringa?
                  $file_s= "./1/index.html";    # index.html - jakis istniejacy plik
    
                  # wysyła odpowiedź zwrotną. Czy tu można podać ścieżkę pliku?
                  # czy trzeba stringa?
                  $c->send_file_response($file_s);
                  
                  # odesłanie nagłówka
                  $c->send_file_response($headers_only);
    
              }
              else {
                  $c->send_error(RC_FORBIDDEN)
              }
    
          }
          $c->close;
          undef($c);
      }
    Teraz trochę pytań. Metoda send_basic_header podaje tylko tyle inforamcji, po wyświetleniu strony:
    HTTP/1.1 200 OK
    Date: Mon, 08 Jun 2009 22:07:32
    Server: libwww-perl-daemon/1.33

    Co oznacza zielona wartość? W zasadzie nie wiem do końca jakiej metody użyć, bo jest jeszcze klasa HTTP::Headers albo HTTP:Request, która odkapsułkowuje żądania, ale nie wiem jak się posłużyć metodą header($field).

    Użyłem metody send_file_response(headers_only) i jest fajnie, bo klient mi w konsoli wyświetla więcej rzeczy:

    HTTP/1.1 404 Not Found
    Date: Mon, 08 Jun 2009 22:48:40 GMT
    Server: libwww-perl-daemon/1.33
    Content-Type: text/html
    Content-Length: 53

    <title>404 Not Found</title>
    <h1>404 Not Found</h1>
    tylko, czegoś tu nie znajduje. Pytanie, czego?

    I jeszcze w LWP::UserAgent jest jakaś metoda ->default_headers, ale ona ustawia jakiś domyślny nagłówek dla wszystkich żądań

    Teraz jeszcze ważna sprawa odnośnie klientów. Wydaje mi się, że cl2 i cl3 powinny odpalać przeglądarki i w nich wyświetlać inforamcje. Tymczasem robią to w konsoli, z której są uruchamiane. Hmm a może bezpośrednio z pliku uruchomię... Jakkolwiek, jakie parametry mam wpisać dla opery 9.64 i IE 8.0.cośtam ?

    "Więcej światła!"

  6. #6
    Zarejestrowany
    Jun 2009
    Skąd
    Wrocław
    Postów
    6

    Domyślnie

    Podejrzałem u kolegi jeszcze coś takiego, żeby nagłówek wysłać tak

    Kod:
    $c->send_response($r->as_string);
    I ten nagłówek chyba podoba mi się najbardziej

    HTTP/1.1 GET / HTTP/1.0
    Host: lukim:4322
    User-Agent: lwp-trivial/1.38



    Date: Tue, 09 Jun 2009 00:03:27 GMT
    Server: libwww-perl-daemon/1.33
    Muszę jeszce przeanalizować komunikaty do i od serwera. Jak je przechwycić w wiresharku? Ewentualnie w innym programie.

  7. #7
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Jak chcesz sprawdzic co Twoj klient wysyla i co odpowiada serwer to:

    Kod:
    GET -SUse http://.......
    Dostaniesz oba zestawy naglowkow i content strony. GET to wlasnie skrypt napisany w LWP o ile pamietam, ktory instlauje sie w systemie razem z modulami perla
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

Podobne wątki

  1. [Perl] Kurs Perl - cz.1 - wprowadzenie i podstawy
    By TQM in forum Perl/Python/TCL/Prolog
    Odpowiedzi: 22
    Autor: 10-27-2014, 01:50
  2. Odpowiedzi: 18
    Autor: 07-14-2009, 12:55
  3. Odpowiedzi: 31
    Autor: 05-20-2008, 18:01

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj