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();
}
}
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);
}
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!