Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Web server koji vraca html datoteke i slike

[es] :: Java :: Web server koji vraca html datoteke i slike

[ Pregleda: 1613 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Vuksha22
student

Član broj: 193353
Poruke: 10
77.46.142.*



Profil

icon Web server koji vraca html datoteke i slike09.10.2008. u 22:50 - pre 157 meseci
Imam problem sa razumevanjem rada ovog koda, pa bih molio za pomoc.Radi se web serveru koji je u stanju da vraća html datoteke i slike.Kod je sledeci:

Code:

import java.io.*;
import java.net.*;
import java.util.*;


public class httpd {
   public static void main(String args[]) throws IOException {
      int port = getPort(args);

      ServerSocket srvr = new ServerSocket(port);

      System.out.println("httpd running on port: " + port);
      System.out.println("document root is: " +
                         new File(".").getAbsolutePath() + "\n");

      Socket skt = null;

      while(true) {
         try {
            skt = srvr.accept();
            InetAddress addr = skt.getInetAddress();

            String resource = getResource(skt.getInputStream());

            if (resource.equals(""))
              resource = "index.html";

            System.out.println("Request from " + addr.getHostName() + ": " +
                             resource);

            sendResponse(resource, skt.getOutputStream());
            skt.close();
            skt = null;
         } catch(IOException ex) {
            ex.printStackTrace();
         }
      }
   }

   static int getPort(String args[]) {
      int port = 80;

      if (args.length == 0) {
         return port;
      }

      try {
         port = Integer.parseInt(args[0]);
      } catch(NumberFormatException ex) {}

      return port;
   }

   static String getResource(InputStream is) throws IOException {
      BufferedReader dis
          = new BufferedReader(new InputStreamReader(is));
      String s = dis.readLine();
      System.out.println(s);

      StringTokenizer hdr = new StringTokenizer(s);

      // prva linija HTTP zahteva: METOD /resurs HTTP/verzija
      // obradjujemo samo GET metodu
      String method = hdr.nextToken();
      if (!"GET".equals(method)) {
         return null;
      }

      String rsrc = hdr.nextToken();

      // izbacimo znak '/' sa pocetka
      rsrc = rsrc.substring(1);

      // ignorisemo ostatak zaglavlja
      String s1;
      while (!(s1 = dis.readLine()).equals(""))
        System.out.println(s1);

      return rsrc;
   }

   static void sendResponse(String resource, OutputStream os) throws IOException {
      PrintStream ps = new PrintStream(os);
      // zamenimo web separator sistemskim separatorom
      resource = resource.replace('/', File.separatorChar);
      File file = new File(resource);

      if (!file.exists()) {
         // ako datoteka ne postoji, vratimo kod za gresku
         ps.print("HTTP/1.0 404 File not Found\r\n\r\n");
         ps.flush();
         System.out.println("Could not find resource: " + file);
         return;
      }

      // ispisemo zaglavlje HTTP odgovora
      ps.print("HTTP/1.0 200 OK\r\n\r\n");

      // a, zatim datoteku
      FileInputStream fis = new FileInputStream(file);
      byte[] data = new byte[8192];
      int len;

      while((len = fis.read(data)) != -1) {
         ps.write(data, 0, len);
      }

      ps.flush();
      fis.close();
   }
}




Prva stvar koja me interesuje je zasto se nakon unosa http:/localhost/ u adresnu liniju weba browsera, u komandnom prozoru pokrenutog servera prikaze da je dva puta poslata metoda GET. Zar ne bi trebalo da se to desilo samo jednom, prilikom unosa date adrese? Kada se to drugi put pozove getResponse()?
Komandni prozor servera izgleda ovako:
Citat:

httpd running on port: 80
document root is: E:\Desktop\WEB\WEB programiranje\ZIP fajlovi\primeri1\deo01\pr
imer04\.

GET / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/2006
1010 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plai
n;q=0.8,image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cache-Control: max-age=0
Request from localhost: index.html
GET /tomcat.gif HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/2006
1010 Firefox/2.0
Accept: image/png,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/
Cache-Control: max-age=0
Request from localhost: tomcat.gif



Druga stvar koja me interesuje je razjasnjenje ovog dela koda. Nisam uspeo da u potpunosti razumem sta se tu tacno desava, pa ako moze neko malo da mi pomogne.
Code:

 FileInputStream fis = new FileInputStream(file);
      byte[] data = new byte[8192];
      int len;

      while((len = fis.read(data)) != -1) {
         ps.write(data, 0, len);
        
      }


Pocetnik sam pa ne zamerite ako su pitanja malo trivijalna.
Unapred hvala!
 
Odgovor na temu

del-boy
Bojan Delić
Beograd

Član broj: 9330
Poruke: 1089

Sajt: www.delic.in.rs


+21 Profil

icon Re: Web server koji vraca html datoteke i slike10.10.2008. u 00:24 - pre 157 meseci
Pretpostavljam da imaš sliku na stranici index.html (koliko vidim slika se zove tomcat.gif). HTTP u jednom request-u samo jedan resurs isporučuje. Prvi put HTML stranicu... Zatim klijent parsira HTML, vidi da mu treba i slika i pošalje novi zahtev. Ako je više slika (ili ako imaš JavaScript ili CSS u posebnom fajlu ili bilo koji drugi resurs koji je još potreban za ispravno funkcionisanje stranice) onda se toliko puta šalje HTTP zahtev. Zbog toga imaš dva request-a...

Što se tiče dela koda koji si postavio, tu se samo čita fajl koji je klijent zahtevao u čankovima od po 8KB i svaki put kad se pročita pošalje se u soket klijentu. Prilikom svakog čitanja read metoda vraća broj pročitanih bajtova tako da znaš koliko upisuješ. Kad dođe do kraja datoteke vraća -1 i to je uslov izlaska iz petlje. Ovo se radi da ne bi učitavao velike fajlove cele u memoriju...
 
Odgovor na temu

Vuksha22
student

Član broj: 193353
Poruke: 10
*.inffo.net.



Profil

icon Re: Web server koji vraca html datoteke i slike10.10.2008. u 13:28 - pre 157 meseci
Aha, donekle mi je jasnije ovo sa 2 zahteva klijenta.znaci, zato sto je slika na stranici,njemu je potrebo da pribavi i tu sliku,i onda je trazi iz tog direktrijuma gde je i index.html,jel tako?
A kazi mi jos nesto,prilikom slanja index.html klijentu, ona se salje kao html kod, ili ne?zapravo se cita html kod te stranice i tako se salje klijentu?I on iz tog koda vidi da postoji i slika? ili je nesto drugo u pitanju?
A ova while petlja, tu se dakle iscita sadrzaj index.html (html kod), velicine 8kb, napuni se data, i onda se posalje klijentu, i tako redom, deo po deo se puni data(cim se napuni prekida se citanjem?), dok ne stigne do kraja? A na neki nacin se pamti dokle se stiglo svaki put sa citanjem index.html?

Hvala ti, razjasnio si mi neke stvari, i ako imas strpljenja i za ova pitanja, zahvalan sam :)
 
Odgovor na temu

del-boy
Bojan Delić
Beograd

Član broj: 9330
Poruke: 1089

Sajt: www.delic.in.rs


+21 Profil

icon Re: Web server koji vraca html datoteke i slike10.10.2008. u 19:56 - pre 157 meseci
Prvi deo si dobro skontao... Naravno, pre HTML koda server pošalje i HTTP zaglavlje... Isto tako šalje i sliku, prvo HTTP response, pa sliku, bukvalno kako je čita sa diska, bez ikakvih izmena, bajt po bajt... Na isti način se šalje bilo koji resurs (pdf, mp3...) samo što postaviš drugačiju vrednost za Content-Type vrednost u hederu i na osnovu toga klijent (browser) odluči šta će sa tim da radi (da li da prikaže ili da ti ponudi download ili da otvori neki treći program...)

I petlju si dobro opisao... data je veličine 8KB i svaki put se puni. U jednom trenutku (u poslednjoj iteraciji) može da se desi da data ne bude napunje skroz nego da, recimo, bude 4KB podataka, ali pošto imaš dužinu pročitanih bajtova (len) toliko i pošalješ u soket i nemaš problema. Read pamti dokle je došao sa čitanjem prošli put. Postoji seek metoda koja možda da pomeri taj pokazivač dokle je pročitano ako ti je to potrebno (e sad, ne sećam se da li se zove seek u javi, mada u većini drugih jezika jeste, pa ne vidim razlog zašto ne bi bila i ovde).
 
Odgovor na temu

Vuksha22
student

Član broj: 193353
Poruke: 10
*.inffo.net.



Profil

icon Re: Web server koji vraca html datoteke i slike10.10.2008. u 22:40 - pre 157 meseci
Samo jos jedno pitanje, zasto je potrebno da taj index.html fajl iscitavamo kao niz bajtova, zar nismo mogli da jednostavno kao string posaljemo html kod te stranice, sa sve <img src = "tomcat.gif">? A da tomcat.gif, bude jednostavno u direktorijumu u kojem je i server pa da je klijent tako pribavi? Ja sam probao tako, ali nesto ne moze :)...
Da li to znaci da moramo i sliku, takodje da mu posaljemo, a ona mora preko bajtova, ne moze drugacije, pa je moralo sve ovako da se uradi preko bajtova?
I da, ovde koliko vidim nije nista postavljano u Content-Type, da li je to zato sto su bajtovi u pitanju ili ne? Pretpostavljem ne, ali kako zna da je slika u pitanju?Ili ne zna, nego jednostavno to trazi, nasavsi to u html kodu..
Ne znam koliko sam bio jasan, trudio sam se :)
 
Odgovor na temu

del-boy
Bojan Delić
Beograd

Član broj: 9330
Poruke: 1089

Sajt: www.delic.in.rs


+21 Profil

icon Re: Web server koji vraca html datoteke i slike11.10.2008. u 00:02 - pre 157 meseci
Bajtovi se šalju jer ne znaš kakav je sadržaj resursa. I da je HTML u pitanju ne znaš koliko svaki karakter zauzima bajtova (možda je unicode)... Ovako mu sve pošalješ i pustiš ga da se sam snađe... U Content-type obično se stavlja i charset ako je u pitanju text/html, a staviš ga i u meta tag u HTML. Pošto šalješ bajtove, potpuno isti kod ti šalje i slike, tako da tih problema nemaš.

Ti i ovako pošalješ <img src="tomcat.gif"> samo šalješ bajt po bajt, a ne string. A klijet i pretpostavlja da je slika u istom direktorijumu kao i index.html (jer si naveo samo ime slike, a ne recimo "/path/to/image/tomcat.gif") i tako i pribavlja tu sliku. Pretpostavljam da pokušavaš da sve proguraš kroz jedan zahtev, ali HTTP ne radi tako... Moraš imati dva zahteva, u ovom slučaju.

U ovom kodu koji si postavio Content-Type se ne postavlja... U stvari, ne postavlja se ništa sem najosnovnijeg HTTP response zaglavlja (HTTP/1.0 200 OK ili HTTP/1.0 404 File not Found). U tom slučaju ne znam kako klijent zna koji je tip fajla u pitanju (pretpostavljam na osnovu ekstenzije, ali ne smem da tvrdim). U suštini uvek treba da postaviš Content-Type, jer samo na osnovu niza bajtova klijent ne može da pretpostavi šta šalješ.

Pročitaj ovo, da razjasniš kako tačno HTTP radi:
http://www.w3.org/Protocols/rfc2616/rfc2616.html
http://en.wikipedia.org/wiki/HTTP
 
Odgovor na temu

Vuksha22
student

Član broj: 193353
Poruke: 10
*.inffo.net.



Profil

icon Re: Web server koji vraca html datoteke i slike11.10.2008. u 11:18 - pre 157 meseci
Ok, hvala ti, puno si mi pomogao da razjasnim neke stvari!
Hvala ti puno jos jednom!
 
Odgovor na temu

[es] :: Java :: Web server koji vraca html datoteke i slike

[ Pregleda: 1613 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.