Kamis, 15 Desember 2011

Contoh Pemrograman pada Jaringan


Contoh ini melibatkan dua program, yaitu klien sederhana dan servernya. Klien melakukan koneksi dengan server, membaca satu baris teks dari server, kemudian menampilkan teks ini pada layar. Teks yang dikirim oleh server adalah tanggal dan waktu saat ini di komputer di mana server dijalankan.

Untuk membuka koneksi, klien harus tahu di komputer mana server dijalankan dan di port mana server tersebut mendengarkan permintaan sambungan. Server akan mendengarkan pada port bernomor 32007. Nomor port ini bisa berapapun di antara 1025 hingga 65535, asalkan klien dan servernya menggunakan port yang sama. Nomor port antara 1 hingga 1024 hanya digunakan oleh layanan standar dan seharusnya tidak digunakan untuk server lainnya.

Nama komputer atau alamat IP di mana server dijalankan harus diberikan pada paramater baris perintah. Misalnya jika server dijalankan pada komputer kita sendiri, kita bisa memanggilnya dengan "java KlienTanggal localhost". Berikut ini adalah program klien lengkapnya.
import java.net.*;
import java.io.*;
 
public class KlienTanggal {
 
    static final int PORT_PENDENGAR = 32007;
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        String komputer;  // Nama komputer yang akan disambungkan
        Socket koneksi;   // Soket untuk berkomunikasi dengan
                          // komputer tersebut
        Reader masuk;     // Aliran untuk membaca data dari koneksi
 
        /* Ambil nama komputer dari baris perintah */
 
        if (args.length > 0)
           komputer = args[0];
        else {
           // Tidak ada nama komputer yang diberikan
           // Beri pesan kesalahan dan program selesai
           System.out.println("Cara menggunakan :  java KlienTanggal ");
           return;
        }
 
        /* Buat koneksi, kemudian baca dan tampilkan di layar */
 
        try {
           koneksi = new Socket( komputer, PORT_PENDENGAR );
           masuk = new InputStreamReader( koneksi.getInputStream() );
           while (true) {
              int ch = masuk.read();
              if (ch == -1 || ch == '\n' || ch == '\r')
                 break;
              System.out.print( (char)ch );
           }
           System.out.println();
           masuk.close();
        }
        catch (IOException e) {
           System.out.println("Kesalahan :  " + e);
        }
    }
}

Perhatikan bahwa semua komunikasi dengan server dilakukan dalam pernyataan try ... catch. Ini akan menangkap pengecualian IOException yang mungkin terjadi ketika koneksi sedang dibuka atau ditutup atau sedang membaca karakter dari aliran input.

Aliran yang digunakan adalah aliran sederhana Reader yang memiliki operasi input masuk.read(). Fungsi ini membaca satu per satu karakter dari aliran, kemudian mengembalikan nomor kode Unicodenya. Jika akhir aliran telah dicapai, maka nilai -1 akan dikembalikan. Perulangan while membaca karakter ini satu per satu hingga akhir aliran ditemui atau akhir baris ditemui. Akhir baris ditandai dengan salah satu dari '\n' atau '\r' atau keduanya, tergantung dari jenis komputer di mana server tersebut berjalan.

Agar program ini dapat berjalan tanpa kesalahan, maka program server harus dijalankan terlebih dahulu. Kita bisa membuat program klien dan server pada komputer yang sama. Misalnya kita bisa membuat dua jendela konsol pada windows, kemudian menjalankan server di konsol yang satu dan menjalankan klien di server yang lain. Agar ini bisa berjalan, komputer lokal kita memiliki alamat 127.0.0.1, sehingga perintah "java KlienTanggal 127.0.0.1" artinya sama dengan memerintahkan program KlienTanggal untuk melakukan sambungan dengan server yang berjalan di komputer yang sama. Atau bisa juga menggunakan alamat "localhost" sebagai pengganti "127.0.0.1".

Program servernya kita namakan ServerTanggal. Program ServerTanggal membuat ServerSocket untuk mendengarkan permintaan sambungan pada port 32007. Setelah soket pendengar kita buat, maka server akan masuk pada perulangan tak hingga di mana ia menerima dan mengolah permintaan sambungan. Program ini akan berjalan terus menerus tanpa henti kecuali kita hentikan dengan paksa -- misalnya dengan menekan tombol Ctrl-C di jendela konsol di mana server dijalankan.

Ketika koneksi diterima dari klien, server akan memanggil subrutin lain untuk menangani koneksi tersebut. Dalam subrutin itu, pengecualian apapun yang terjadi akan ditangkap sehingga server tidak akan mati. Subrutin akan membuat aliran PrintWriteruntuk mengirim data melalui koneksi yang terjadi.

Server akan menulis tanggal dan waktu sekarang pada aliran output ini, kemudian menutup koneksi. (Kelas standarjava.util.Date akan digunakan untuk mengambil tanggal saat ini. Objek bertipe Date melambangkan tanggal dan waktu. Konstruktor standarnya, "new Date()" membuat objek yang melambangkan tanggal dan waktu ketika objek tersebut dibuat.)

Berikut ini adalah program server lengkapnya :
import java.net.*;
import java.io.*;
import java.util.Date;
 
public class ServerTanggal {
 
    static final int PORT_PENDENGAR = 32007;
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        ServerSocket pendengar; // Mendengarkan sambungan yang masuk
        Socket koneksi; // Untuk berkomunikasi dengan sambungan yang masuk
 
        /*
         * Menerima dan mengolah sambungan selamanya, atau hingga kesalahan
         * terjadi. (Kesalahan yang terjadi ketika sedang berkomunikasi atau
         * mengirimkan tanggal akan ditangkap untuk mencegah server crash)
         */
 
        try {
            pendengar = new ServerSocket(PORT_PENDENGAR);
            System.out.println("Mendengarkan pada port " + PORT_PENDENGAR);
            while (true) {
                koneksi = pendengar.accept();
                kirimTanggal(koneksi);
            }
        } catch (Exception e) {
            System.out.println("Maaf, server telah mati.");
            System.out.println("Kesalahan :  " + e);
            return;
        }
    }
 
    static void kirimTanggal(Socket klien) {
        // Parameternya, klien, adalah soket yang telah terhubung dengan
        // program lain. Ambil aliran keluaran untuk melakukan sambungan,
        // kirim tanggal saat ini dan tutup sambungan.
        try {
            System.out.println("Sambungan dari "
                    + klien.getInetAddress().toString());
            Date sekarang = new Date(); // Tanggal dan waktu saat ini
            PrintWriter keluar; // Aliran output untuk mengirim tanggal
            keluar = new PrintWriter(klien.getOutputStream());
            keluar.println(sekarang.toString());
            keluar.flush(); // Pastikan data telah terkirim!
            klien.close();
        } catch (Exception e) {
            System.out.println("Kesalahan : " + e);
        }
    }
}

Jika kita jalankan ServerTanggal pada konsol, maka ia akan diam menunggu datangnya permintaan sambungan dan melaporkannya apabila permintaan telah masuk. Agar layanan ServerTanggal tetap tersedia pada suatu komputer, program tersebut seharusnya dijalankan sebagai daemon. Daemon adalah program yang terus berjalan pada suatu komputer, tidak peduli siapa yang menggunakan komputer itu. Komputer bisa dikonfigurasi untuk menjalankan daemon secara otomatis ketika komputer dinyalakan. Kemudian ia akan berjalan di latar belakang, meskipun komputer digunakan untuk hal lainnya. Misalnya, komputer yang menyediakan layanan Web menjalankan daemon yang mendengarkan permintaan sambungan untuk melihat halaman web dan meresponnya dengan mengirimkan isi halaman tersebut. Bagaimana menjalankan program sebagai daemon tidak akan kita bahas di sini, dan bisa Anda temui pada buku-buku tentang administrasi server dan jaringan.

Lihat setelah memanggil keluar.println() untuk mengirim data ke klien, program server memanggil keluar.flush(). Metode flush() tersedia pada semua kelas aliran output. Metode ini digunakan untuk menjamin bahwa data yang telah dikirim pada aliran benar-benar dikirim ke tujuannya. Kita harus memanggil fungsi ini setiap kali kita menggunakan aliran output untuk mengirim data melalui jaringan. Jika tidak, ada kemungkinan program akan mengumpulkan banyak data dan mengirimkan semuanya sekaligus. Mungkin dari segi efisiensi terlihat bagus, akan tetapi tentunya pesan akan sangat lambat sampai di program klien. Atau bahkan masih ada data yang belum terkirim hingga soket ditutup.

Berikut ini adalah screen shot hasil pemanggilan program di atas pada dua konsol, masing-masing untuk server dan kliennya.

Dan program di atas dapat diunduh pada daftar sisipan di bawah, dan diimpor ke dalam Eclipse dengan menggunakan instruksi pada halaman berikut.

Untuk menjalankan program di atas, jalankan program server terlebih dahulu, dari dalam konsol ketik "cd \bin" (di screen shot di atas direktorinya berada di c:\belajarjava.lyracc.com\servertanggal\bin) kemudian ketik "java ServerTanggal".

Kemudian untuk menjalankan program klien, lakukan dengan cara yang serupa, yaitu buka konsol baru, kemudian ketik "cd \bin" (di screen shot di atas direktornya berada di c:\belajarjava.lyracc.com\klientanggal\bin) kemudian ketik "java KlienTanggal localhost".

Untuk mengetahui di direktori mana proyek ini berada pada Eclpse Anda, klik kanan proyek tersebut dari dalam Eclipse -> Properties, seperti pada screen shot berikut ini :

Tidak ada komentar:

Posting Komentar