You are on page 1of 8

Web Server

Oleh : Rahmat Fitra J. Anggi Meirania P. Arafel Mohammad N. Hoyi Ndadak A.

0810680016 0810680024 0810680025 0810680040

PROGRAM STUDI TEKNIK INFORMATIKA FAKULTAS TEKNIK UNIVERSITAS BRAWIJAYA MALANG 2011

package webserverx; // INI ADALAH CLASS WEB SERVER UNTUK MENERIMA MEMPROSES REQUEST //DARI CLIENT (Merupakan Main Class dari Program Web Server) //************************************************** import java.io.*; import java.net.*; import java.util.*; public class WebServer { public static void main(String[] args) { int port = 80; //int port = 80 adalah deklarasi untuk mengeset port yg digunakan yaitu pada port 80 File documentDir = new File("C:/Documents and Settings/anggi/My Documents/NetBeansProjects/webserverx/localhost"); //Fungsi new File ini yang memanggil file di dalam direktori. Untuk mengakses //ditambahkan nama dari file document direktori input yang diinginkan //jika dokument tidak ditemukan akan tampil DOCUMENT DIRECTORY DOES NOT //CONTAIN OR ITS NOT DIRECTORY PRINT ERR MESSAGE if (!documentDir.exists()&&!documentDir.isDirectory()) { System.out.println("No such directory exists make directory named [" + documentDir.getAbsolutePath()+ " ] localhost and put files"); } //jika server berjalan dengan baik, maka akan muncul tulisan WEB SERVER IS RUNNING else { System.out.println("web server is running"); try { //menginisialisasikan soket baru untuk memulai koneksi yang mengakses port 80 ServerSocket serverSocket = new ServerSocket(port); try { //fungsi perulangan tek terbatas untuk menangani proses request while (true) { //fungsi untuk menerima client berikutnya yang connect dan mendapat koneksi soket Socket socket = serverSocket.accept();

//fungsi yang menangani koneksi soket,ditangani dalam thread baru new Thread(new HttpRequest(socket, documentDir)).start(); } } //fungsi yang menangani terjadinya error ketika connect ke port catch (IOException e) { System.err.println("Error while accepting connection on port "+ port); } finally { serverSocket.close(); } } //fungsi yang menangani terjadinya error ketika tersangkut di port catch (IOException e) { System.err.println("Failed to bind to port " + port); } } } } //==============end of the main class==

package webserverx; //INI ADALAH KELAS YANG MENANGANI BANYAK REQUEST import java.io.*; import java.net.*; import java.util.regex.*; import java.util.*; final class HttpRequest implements Runnable { private static final Pattern REQUEST_PATTERN = Pattern.compile("^GET (/.*) HTTP/1.[01]$"); private final File documentDir; private final Socket socket; //-----------------------------------------------------------//CONSTRUCTOR METHOD OF HttpRequest TWO ARGUMENTS // socket and documentDir FOR NEW REQUEST public HttpRequest(Socket socket, File documentDir) { this.socket = socket; this.documentDir = documentDir; } //--------------------------------------------------------------------------//METHOD TO REQUEST THE PATH FROM BROWSER private String readRequestPath() throws IOException { //READ THE REQUEST BufferedReader reader = new BufferedReader(new InputStreamReader( this.socket.getInputStream())); String firstLine = reader.readLine(); if (firstLine == null) { return null; } //COMPILE THE CODE //THIS PART OF CODE TAKEN FROM INTERNET (SUN JAVA).INSTEAD OF THIS WE //CAN USE SRTING //TOKENIZER ALSO BUT THAT SPENTS LOT OF CODE Matcher matcher = REQUEST_PATTERN.matcher(firstLine); return matcher.matches() ? matcher.group(1) : null; }

//------------------------------------------------------------------------------------//THIS METHOD USED FOR SEND RESPONSE //IN THIS CASE I USED STRING BUFFER AND APPEND NECESSERY PARTS OF IT private OutputStream sendResponseHeaders(int status, String message,long len) throws IOException { StringBuffer response = new StringBuffer(); response.append("HTTP/1.0 "); response.append(status).append(' ').append(message).append("\r\n"); response.append("Content-Length: ").append(len).append("\r\n\r\n"); OutputStream out = this.socket.getOutputStream(); //SEND response TO THE OUT PUT STREAM OF CURRENT SOCKET WHEN WE NEED //TO PRINT THE MESSAGE ON WEB BROESER WE CAN USE THIS out.write(response.toString().getBytes()); out.flush(); return out; } //-------------------------------------------------------------------------------//THIS METHOD USED TO SEND ERROR MESSAGE TO THE BROWSER WHEN WE //GIVE ERROR NUMBER AND MESSAGE THAT WILL PRIN USING ABOVE METHOD (sendResponseHeaders) private int sendErrorResponse(int status, String message) throws IOException { OutputStream out = sendResponseHeaders(status, message,message.length()); out.write((message+"\nerror number :"+status).getBytes()); out.flush(); return status; } //-----------------------------------------------------------------------------//THIS METHOD IS USED FOR READ FILE IN THE DOCUMENT DIRECTORY AND SEND //THE CONTENT OF THE FILE TO THE SOCKET.THEN WEB BROWSER CAN ACCES //THEM VIA PORT private long sendFile(File file) throws IOException { long len = file.length(); OutputStream out = sendResponseHeaders(200, "OK", len); InputStream in = new FileInputStream(file); try { byte[] buffer = new byte[1024]; int nread = 0; while ((nread = in.read(buffer)) > 0) { out.write(buffer, 0, nread); } } finally {

in.close(); } out.flush(); return len; } //---------------------------------------------------------------------------//THIS IS THE MAIN ENTRY TO THIS HttpRequest public void run() { //IN THIS PART INITIALIZE LOGIN INFOMATION int status = 200; long len = 0; String path = null; //TRY TO HANDLE THE REQUEST try { path = readRequestPath(); //THIS IS FOR BONUS MARK ,IF PATH CONTAINSONLY"/" //THAT TAKES AS index.html FILE BELOW IF LOOP CHECK THAT //THIS ALSO DISPLAYS THE CURRENTLY SHOWING FILE NAME AT COMMAND LINE if(path.equals("/")) { path=path+"index.html"; System.out.println("RETTEIVING FILE IS "+this.documentDir.getAbsolutePath()+path); } //IF PATH NOT AVAILABLE SEND ERROR MESSAGE TO THE BROWSER if (path == null) { status = sendErrorResponse(400, "Bad Request"); } //IF HAS SOME PATH TRY TO ACCCESS GIVEN PATH else { File file = new File(this.documentDir, path); //CHECK GIVEN FILE IS AVAILABLE IN THE GIVEN DOCUMENT AND CHECK //WETHER IT CAN READ OR NOT //ONLY FOR READABLE FILES IN THE CORRECT PATH GIVEN if (!file.getAbsolutePath().startsWith(this.documentDir.getAbsolutePath())|| (file.exists() && (!file.isFile() || !file.canRead()))) { status = sendErrorResponse(403, "Forbidden"); } //IF FILE DOES NOT FOUN SEN MESSAGE TO AWARE THATS NOT AVAILABLE else if (!file.exists()) { status = sendErrorResponse(404, "Not Found"); } //IF NO ANY ISSUE SEND THE FILE else

{ len = sendFile(file); } } } //ERROR HANDLING PART catch (IOException e) { System.out.println("Error while serving request for " + e.getMessage()); e.printStackTrace(); } finally { try { this.socket.close(); } catch (IOException e) { System.out.println("Error while closing socket to " + e.getMessage()); } } } } //================================

Jika program di run / di jalankan, maka akan tampil tulisan : web server is running Dan ketika browser melakukan panggilan ke alamat localhost ( http://127.0.0.1/ ) ,maka akan tampil halaman index.html yang sudah ada dala dokument server :

Selain itu,dapat pula memanggil file dalam format lain, contonya : 1. format .txt ==> dengan memasukkan nama filenya http://localhost/a.txt

2. format gambar .gif ==> dengan memasukkan nana filenya http://localhost/aa.gif

You might also like