4.15.2013

Program Web Server Sederhana


Web server merupakan komputer yang bertugas menyajikan konten web yang bisa diakses melalui internet. Web server sederhana setidaknya bisa melayani permintaan dari komputer klien dengan mengirimkan respon berupa halaman HTML yang diminta.

Proses Permintaan Halaman Web

Saat komputer klien melalui browser-nya hendak membuka suatu halaman web, browser akan melakukan permintaan ke web server dengan melakukan HTTP request. Pesan permintaan tersebut dikirim dengan method GET. Pesan tersebut memiliki header yang memuat informasi mengenai halaman apa yang akan dibuka. Dengan memanfaatkan informasi tersebut, web server akan merespon permintaan dengan mengirimkan halaman yang diminta.
Dengan konsep tersebut, web server sederhana dapat dibuat. Sebuah web server akan membuka dan mengawasi/mendengarkan suatu port dalam komputer. Pesan atau permintaan yang masuk melalui port tersebut kemudian akan diproses dan direspon.

Respon Web Server Terhadap Permintaan

Pemrosesan pesan yang masuk melalui port tersebut terjadi dalam beberapa langkah. Pertama, socket dibuat untuk port tersebut. Kemudian, input stream  dibuat dari socket tersebut untuk menerima pesan yang datang. Pesan yang datang merupakan data bertipe binary. Data biner tersebut akan kemudian di ubah ke char yang kemudian akan disatukan ke dalam sebuah variabel bertipe string. Variabel string inilah yang memuat pesan lengkap yang dikirim oleh browser klien.
Web server sederhana akan merespon pesan yang sudah diproses menjadi variable string tersebut. Objek halaman yang diminta oleh klien kemudian ditentukan path-nya berdasarkan informasi yang tertera dalam string pesan. Path objek berada setelah kata kunci GET.

Format String Respon Berdasarkan Protokol HTTP

Respon yang diberikan oleh web server sederhana tersebut merupakan string respon yang memiliki format tertentu. Format respon tersebut harus sesuai dengan protokol HTTP agar browser klien mengerti akan respon yang dikirimkan oleh web server.  Adapun format pesan respon tersebut adalah sebagai berikut.
HTTP/1.0 200 OK\r\n
Content-Type: text/html\r\n
Server: Bot\r\n
\r\n
 <<text html>>

Bagian <<text html>> merupakan bagian yang akan diisi oleh HTML dari halaman web yang diminta. Untuk memasukkan string HTML ke dalam string respon, web server sederhana membutuhkan file input stream untuk membaca sebuah file HTML dan mendapatkan teks source code HTML.

Setelah string HTML ditambahkan dan semuanya berjalan normal, web server sederhana akan mengirimkan string respon tersebut ke socket melalui output stream. Dari output stream tersebut, data string respon akan mengalir menuju port dari socket yang telah dibuat untuk kemudian dikirim melalui jaringan komputer / internet ke port 80 pada komputer klien.


Sekilas Tentang Port 80

Port 80 merupakan port yang ditujukan untuk melakukan HTTP request. Pesan yang datang dari port tersebut akan diproses oleh browser klien. Hasil proses tersebut adalah halaman web yang ditampilkan pada user interface pada browser klien tersebut. Halaman web tersebut berasal dari kode HTML yang dihasilkan oleh pemrosesan pesan respon yang dikirimkan oleh web server sederhana.

Kode Program Web Server Sederhana

Web server sederhana dapat dibuat dengan menggunakan berbagai macam bahasa pemrograman. Bisa dengan Phyton, C++, Java, dan lain-lain. Berikut ini merupakan contoh kode program web server sederhana yang dibuat dengan bahasa pemrograman Java berdasarkan konsep yang telah dijelaskan sebelumnya. Simpan kode program berikut ini ke dalam sebuah file berekstensi .java untuk menjalankannya (lanjutan kode program ada di halaman selanjutnya).
package servere8;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

/* fungsi readLine berfungsi mendapatkan sebaris string dari
   pesan request yang masih berbentuk biner
 */
    public static String readLine(InputStream is) throws IOException
    {
        String request = "";

        int c;
        while(true){
            c = is.read();
            request += (char) c;

            if((char) c == '\n')
                break;
        }

        return request;
    }




    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(2222);
            while(true){
                Socket s = ss.accept();
                BufferedInputStream is = new BufferedInputStream(s.getInputStream());
                BufferedOutputStream os = new BufferedOutputStream(s.getOutputStream());

                int c, line;
                line = 0;
                String request = "";
                String path = "";

                while(!(request = readLine(is)).equals("\r\n")){
                    System.out.print(request);

                /* kode di bawah ini bertujuan untuk mendapatkan halaman apa
                   yang diminta oleh klien
                 */
                    if(line == 0){
                        int start = 5;
                        for(int i=start; true ; i++){
                            if(request.charAt(i) != ' '){
                                path += request.charAt(i);
                            }
                            else break;
                        }
                    }

                    line++;
                }
                System.out.print(request);

                String body = "";
                FileInputStream ifs = new FileInputStream(path);

                /* kode di bawah ini melakukan input stream dari file HTML
                   yang diminta oleh klien
                 */
                while((c = ifs.read()) != -1){
                    body += (char) c;
                }

                String response = "";

                /* pesan respon dengan format tertentu yang
                   akan dikirim ke klien
                 */
                response = "HTTP/1.0 200 OK\r\n" +
                           "Content-Type: text/html\r\n" +
                           "Server: Bot\r\n" +
                           "\r\n" +
                           body;

                os.write(response.getBytes());
                os.flush();


                is.close();
                os.close();
                s.close();
            }

        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}

Tidak ada komentar:

Posting Komentar