Cari Blog Ini

Senin, 14 Februari 2011

Belajar Java Dalam Jaringan

Posted by wahyu@net on 21.42

Jaringan (network)

 

Dalam pemrograman, jaringan (network) hanyalah salah satu jenis dari input di mana data bisa diambil, dan output di mana data bisa dikirim. Konsep ini mempermudah pemahaman kita tentang pemrograman dalam jaringan, akan tetapi ada beberapa hal lain yang harus diperhatikan sehingga pemrograman pada jaringan dapat berhasil dengan baik.
Pada Java, kita bisa menggunakan aliran input dan output untuk melakukan komunikasi pada network, seperti halnya pada file. Akan tetapi membuat koneksi jaringan antara dua komputer sedikit lebih rumit, karena ada dua komputer yang berbeda, yang keduanya harus setuju membuka koneksi. Dan ketika data dikirimkan dari satu komputer ke komputer lain, komunikasi harus dilakukan seirama sehingga data yang dikirimkan akan sampai ke komputer yang lain.
Salah satu paket Java standar adalah java.net. Paket ini memiliki beberapa kelas yang bisa digunakan untuk berkomunikasi melalui jaringan. Dua jenis I/O network disediakan dalam paket ini. Yang pertama, yang lebih tinggi tingkatannya, berdasarkan pada Web dan memberikan fasilitas komunikasi seperti halnya web browser ketika mendownload suatu halaman web untuk kemudian ditampilkan. Kelas utama dalam jenis network seperti ini adalah java.net.URL dan java.net.URLConnection. Suatu objek bertipe URL adalah lambang abstrak dari sebuah URL (Universal Resource Locator), yaitu alamat web di mana dokumen HTML atau lainnya bisa ditemukan pada web. Sedangkan URLConnection adalah koneksi network ke dokumen tadi.
Jenis I/O kedua adalah melihat jaringan pada tingkatan yang lebih rendah, yaitu berdasarkan ide suatu soket (socket). Soket digunakan oleh program untuk melakukan koneksi dengan program lain pada suatu jaringan. Komunikasi melalui network melibatkan dua soket, yaitu masing-masing pada setiap komputer. Java memiliki kelas java.net.Socket untuk merepresentasikan suatu soket yang digunakan dalam komunikasi network.
Istilah "soket" mungkin mirip dengan colokan kabel data (misalnya) modem, akan tetapi penting untuk diingat bahwa soket adalah objek bertipe Socket. Artinya program bisa memiliki beberapa soket dalam waktu yang sama, yang masing-masing terhubung ke program yang dijalankan pada komputer lain. Semuanya menggunakan koneksi network yang sama dari satu kabel.
Bagian ini akan memberikan pengenalan tentang kelas-kelas dasar jaringan, dan bagaimana hubungannya dengan aliran input dan ouput serta pengecualian.

URL dan URLConnection

Kelas URL digunakan untuk merepresentasikan suatu sumber pada Web. Setiap sumber memiliki alamat, yang unik (tidak bisa sama), dan memiliki informasi yang cukup sehingga web browser bisa mencari sumber tersebut dan mengambilnya. Alamat ini disebut "url" atau "universal resource locator".
Suatu objek beritpe kelas URL melambangkan alamat tersebut. Jika kita sudah memiliki objek bertipe URL, maka kita bisa membuka URLConnection ke alamat tersebut. Suatu url biasanya berupa string, misalnya "http://java.lyracc.com/belajar/java-untuk-pemula/bab-i-pendahuluan". Ada juga yang disebut url relatif. URL relatif adalah lokasi suatu sumber relatif terhadap url lain, yang biasanya disebut landasan (base) atau konteks (context) dari url relatif tersebut. Misalnya jika konteksnya adalah http://java.lyracc.com/belajar/java-untuk-pemula/ maka url relatif dari "bab-i-pendahuluan" akan menunjuk pada http://java.lyracc.com/belajar/java-untuk-pemula/bab-i-pendahuluan.
Suatu objek bertipe URL bukan string sederhana, akan tetapi dibangun dari kumpulan string yang membentuk suatu url. Objek URL juga bisa dibuat dari objek URL lain, yang merupakan konteksnya, dan string lain yang berisi relatif urlnya. Konstruktornya memiliki bentuk seperti :
public URL(String alamatURL) throws MalformedURLException
dan
public URL(URL konteks, String alamatRelatif) throws MalformedURLException
Lihat bahwa kedua konstruktor akan melempar pengecualian bertipe MalformedURLException jika string yang diberikan bukan nama url legal. Kelas MalformedURLException merupakan kelas turunan dari IOException yang wajib ditangani, sehingga konstruktor di atas harus dipanggil dalam pernyataan try ... catch atau ditulis di dalam subrutin yang melempar pengecualian ini.
Konstruktur jenis kedua akan lebih nyaman digunakan untuk applet. Dalam applet, tersedia dua metode yang bisa digunakan untuk mengambil konteks URL. Metode getDocumentBase() pada kelas Applet mengembalikan objek bertipe URL. Objek URL ini adalah lokasi tempat halaman HTML yang berisi applet tersebut berada. Dengan ini, kita bisa memerintahkan applet untuk kembali dan mengambil file lain yang disimpan di tempat yang sama. Misalnya,
URL url = new URL(getDocumentBase(), "data.txt");
membuat URL baru yang merujuk pada file bernama data.txt pada komputer yang sama dan pada direktori yang sama pada halaman web di mana applet tersebut sedang berjalan.
Metode lainnya, yaitu getCodeBase(), mengembalikan URL yang merupakan lokasi di mana applet tersebut berada (belum tentu sama dengan lokasi HTML-nya).
Setelah kita memiliki objek URL yang benar, kita bisa memanggil openConnection() untuk membuka koneksi pada URL tersebut. Metode ini mengembalikan objek bertipe URLConnection. Objek URLConnection bisa digunakan untuk membuka InputStream untuk membaca halaman atau file pada alamat URL tersebut, yaitu dengan menggunakan metode getInputStream(). Misalnya :
URL url = new URL(alamatURL);
URLConnection koneksi = url.openConnection();
InputStream dataURL = connection.getInputStream();
Metode openConnection() dan getInputStream dapat melempar pengecualian IOException. Jika InputStream berhasil dibuka, kita bisa menggunakannya dengan cara biasa, termasuk membungkusnya dalam aliran input jenis lain, misalnya BufferedReader. Membaca dari aliran ini tentunya juga bisa melemparkan pengecualian.
Salah satu metode instansi yang berguna dalam kelas URLConnection adalah getContentType(), yang mengembalikan String yang menjelaskan jenis informasi pada URL yang ditunjuk. Hasilnya bisa bernilai null jika jenisnya belum diketahui, atau tidak bisa ditentukan. Jenis dokumen bisa saja belum tersedia hingga aliran input berhasil dibuat, sehingga lebih baik menggunakan getContentType() setelah getInputStream() berhasil dilakukan.
String yang dikembalikan oleh getContentType() ditulis dalam format yang disebut MIME, misalnya "text/plain", "text/html", "image/jpeg", "image/gif", dan banyak lagi lainnya. Semua jenis MIME terdiri dari dua bagian, yaitu bagian umum, seperti "text" atau "image", dan bagian khususnya, misalnya "html" atau "gif". Jika kita hanya tertarik pada data teks misalnya, kita hanya perlu menguji apakah hasil keluaran getContentType() dimulai dengan "text". (Jenis MIME pertama kali dimaksudkan untuk menjelaskan isi email. Namanya adalah singkatan dari "Multipurpose Internet Mail Extensions". Kini, MIME digunakan secara umum untuk menjelaskan jenis suatu informasi atau file pada suatu sumber).
Mari kita lihat contoh singkat bagaimana membaca data dari suatu URL. Subrutin berikut akan membuka koneksi ke URL tertentu, mengecek apakah jenisnya berupa teks, kemudian mengkopi hasilnya ke layar. Beberapa operasi dalam subrutin ini mungkin melempar pengecualian. Kita akan menambahkan "throws Exception" di kepala subrutin untuk meneruskan penanganan pengecualian ini kepada program utama yang memanggil subrutin ini.
static void bacaTeksDariURL( String alamatURL ) throws Exception {
        // Subrutin ini mencetak isi dari alamat URL yang
        // diberikan ke layar. Semua kesalahan akan ditangani
        // oleh program yang memanggil subrutin ini
 
        /* Buka koneksi ke URL, dan ambil aliran input
         * untuk membaca data dari URL. */
 
        URL url = new URL(alamatURL);
        URLConnection koneksi = url.openConnection();
        InputStream dataURL = koneksi.getInputStream();
 
        /* Cek apakah konten bertipe teks */
 
        String jenisKonten = koneksi.getContentType();
        if (jenisKonten == null || jenisKonten.startsWith("text") == false)
            throw new Exception("URL tidak bertipe teks.");
 
        /* Kopi karakter dari aliran input ke layar
         * hingga akhir file ditemukan (atau kesalahan ditemui) */
 
        while (true) {
            int data = dataURL.read();
            if (data < 0)
                break;
            System.out.print((char)data);
        }
    } // akhir bacaTeksDariURL()
 
 
 
 

Soket, Klien, dan Server

Komunikasi melalui internet dilakukan berdasarkan sepasang protokol yang dinamakan Internet Protocol dan Transmission Control Protocol, yang digabungkan menjadi TCP/IP. (Sebenarnya, ada lagi protokol komunikasi yang lebih sederhana yang disebut dengan UDP yang bisa digunakan menggantikan TCP pada beberapa aplikasi. UDP juga didukung Java, akan tetapi kita akan membahas TCP/IP saja yang merupakan komunikasi dua arah yang handal digunakan pada beberapa komputer melalui jaringan).
Agar dua program dapat berkomunikasi menggunakan TCP/IP, masing-masing program harus membuat soket, yang kemudian soket-soket tersebut harus terhubung satu sama lain. Setelah terhubung, komunikasi dapat dilakukan dengan menggunakan aliran input dan output seperti biasa. Setiap program harus memiliki aliran input dan outputnya masing-masing. Data yang ditulis oleh suatu program di aliran outputnya akan dikirim ke komputer lain. Di sana, data tersebut akan diisi pada aliran input program tersebut. Ketika program tadi membaca aliran inputnya, maka pada dasarnya program tersebut membaca data yang dikirim oleh program lain.
Bagian tersulitnya adalah bagaimana membuat koneksi antar komputer tersebut. Dalam hal ini, dua soket akan digunakan. Pertama-tama, suatu program harus membuat soket yang menunggu secara pasif hingga koneksi lain dari soket lain di komputer lain datang. Soket yang sedang menunggu ini disebut sedang "mendengar" (listening) suatu koneksi.
Di sisi lain di komputer lain, program lain membuat soket yang mengirim permintaan sambungan ke soket pendengar tadi. Ketika soket pendengar menerima permintaan sambungan dari soket lain, soket ini akan merespon, sehingga komunikasi akan terjadi. Begitu komunikasi terjadi, maka masing-masing program akan bisa membuat aliran input dan aliran output untuk koneksi ini. Komunikasi akan terus terjadi hingga salah satu program menutup (close) koneksi.
Program yang membuat soket pendengar, juga sering disebut server, dan soketnya disebut soket server. Program yang menghubungi server disebut klien (client), dan soket yang digunakan disebut soket klien.
Idenya adalah suatu server di suatu tempat pada network sedang menunggu permintaan sambungan dari suatu klien. Server dianggap sebagai sesuatu yang memberikan layanan, dan klien mendapatkan layanan dengan cara menyambungkannya pada server. Pada komunikasi jaringan, ini disebut model klien/server.
Dalam aplikasi dunia nyata, program server dapat memberikan koneksi kepada beberapa klien pada waktu yang sama. Ketika suatu klien terhubung pada soket pendengar, maka soket tersebut tidak berhenti mendengar. Akan tetapi, soket tersebut akan terus mendengar jika ada koneksi klien lain pada saat yang sama.
Kelas URL yang telah didiskusikan sebelumnya menggunakan soket klien di belakang layar untuk melakukan komunikasi jaringan yang dibutuhkan. Di sisi lainnya adalah program server yang menerima permintaan sambungan dari objek URL, membaca permintaan objek tersebut, misalnya permintaan file di alamat tertentu, dan meresponnya dengan mengirimkan isi file tersebut melalui network ke objek URL tadi. Setelah mengirimkan data, server akan memutuskan koneksi ini.

Untuk mengimplementasikan koneksi TCP/IP, paket java.net menyediakan dua kelas, yaitu ServerSocket dan Socket. Objek bertipe ServerSocket melambangkan soket pendengar yang menunggu permintaan sambungan dari klien. Objek bertipe Socket melambangkan sisi lain dari suatu sambungan, yang bisa berarti soket klien, atau bisa saja soket lain yang dibuat server untuk menangani permintaan dari klien. Dengan cara ini server bisa membuat beberapa soket dan menangani beberapa koneksi sekaligus. (Suatu ServerSocket sendiri tidak berpartisipasi langsung pada koneksi itu sendiri; ia hanya bertugas untuk mendengarkan permintaan sambungan, dan membuat Socket untuk melakukan koneksi yang sesungguhnya)
Untuk menggunakan Socket dan ServerSocket, kita harus tahu tentang alamat Internet. Program klien harus bisa menentukan komputer mana yang akan berkomunikasi dengannya. Setiap komputer pada internet memiliki alamat IP yang merupakan alamat unik setiap komputer di dalam internet. Komputer juga bisa memiliki nama domain seperti www.yahoo.com atau www.google.com.
Suatu komputer bisa memiliki beberapa program untuk melakukan komunikasi network secara bersamaan, atau satu program mungkin berkomunikasi dengan beberapa komputer sekaligus. Agar bisa bekerja seperti ini, soket sebenarnya merupakan kombinasi antara alamat IP dan nomor port. Nomor port hanya merupakan bilangan bulat 16-bit (dari 0 hingga 216 - 1). Suatu server tidak hanya mendengar koneksi saja, akan tetapi ia mendengar koneksi dari port tertentu.
Klien yang ingin berkomunikasi dengan server harus mengetahui alamat Internet komputer beserta nomor port di mana server tersebut mendengarkan permintaan sambungan. Server web, misalnya, pada umumnya mendengarkan koneksi pada port 80; layanan internet lain juga memiliki nomor port standar. (Nomor port standar adalah nomor di bawah 1024. Jika kita membuat program server sendiri, kita sebaiknya menggunakan port benomor lebih besar dari 1024).
Ketika kita membuat objek bertipe ServerSocket, kita harus memberikan nomor port yang akan didengar oleh server. Konstruktornya memiliki bentuk seperti
public ServerSocket(int port) throws IOException
Setelah ServerSocket berhasil dijalankan, ia akan mulai mendengarkan permintaan sambungan. Metode accept() dalam kelas ServerSocket akan menerima permintaan tersebut, kemudian mempersiapkan sambungan dengan klien, dan mengembalikan objek Socket yang bisa digunakan untuk berkomunikasi dengan klien. Metode accept() memiliki bentuk seperti
public Socket accept() throws IOException
Ketika kita memanggil metode accept(), ia tidak akan mengembalikan hasilnya sebelum permintaan sambungan diterima (atau suatu kesalahan terjadi). Metode ini disebut "diblokade" ketika menunggu koneksi. (Ketika suatu metode diblokade, maka thread yang memanggil metode tersebut tidak bisa berbuat apa-apa. Akan tetapi thread lain di program yang sama masih bisa berjalan). ServerSocket tersebut akan terus mendengar koneksi hingga ia ditutup menggunakan metode close() atau hingga terjadi kesalahan.
Misalnya kita akan membuat server yang akan mendengarkan port 1728, dan misalnya kita telah menulis metode baru beriLayanan(Socket) untuk menangani komunikasi dengan suatu klien. Maka bentuk sederhana dari program server adalah sebagai berikut :
try {
            ServerSocket server = new ServerSocket(1728);
            while (true) {
               Socket koneksi = server.accept();
               beriLayanan(koneksi);
            }
         }
         catch (IOException e) {
            System.out.println("Server dimatikan dengan pesan kesalahan: " + e);
         }
Di sisi klien, soket klien dibuat dengan menggunakan konstruktor pada kelas Socket. Untuk melakukan koneksi ke server pada suatu alamat dan port tertentu, kita bisa menggunakan konstruktor
public Socket(String komputer, int port) throws IOException
Parameter pertama bisa berupa alamat IP atau nama domain. Konstruktor akan memblokadi dirinya hingga koneksi tersambung atau hingga terjadi kesalahan. Setelah koneksi tersambung, kita bisa menggunakan metode getInputStream() dan getOutputStream() pada Socket untuk mengambil aliran input dan output yang bisa digunakan untuk komunikasi antara dua komputer.
Berikut ini adalah kerangka untuk melakukan koneksi klien :
void koneksiKlien(String namaKomputer, int port) {
        // namaKomputer bisa berupa alamat IP atau nama domain
        // dari komputer yang bertindak sebagai server.
        // port adalah port dimana server mendengarkan koneksi,
        // misalnya 1728.
        Socket koneksi;
        InputStream in;
        OutputStream out;
        try {
           koneksi = new Socket(namaKomputer,port);
           in = koneksi.getInputStream();
           out = koneksi.getOutputStream();
        }
        catch (IOException e) {
           System.out.println(
               "Usah melakukan sambungan gagal, dengan kesalahan : " + e);
           return;
        }
        .
        . // Gunakan aliran in dan out untuk berkomunikasi dengan server
        .
        try {
           koneksi.close();
           // (Atau, bisa juga bergantung pada server untuk
           //  memutuskan sambungan)
        }
        catch (IOException e) {
        }
    }  // akhir koneksiKlien()
Membuat komukasi melalui jaringan terlihat lebih mudah dari yang sebenarnya. Jika jaringan yang kita gunakan benar-benar handal, mungkin perintah di atas cukup untuk digunakan. Akan tetapi, untuk membuat program tangguh yang bisa menangani segala permasalahan dalam jaringan yang kurang handal atau karena kesalahan manusia misalnya, adalah hal yang tidak mudah. Pengalaman yang bisa membawa kita menjadi programmer jaringan yang lebih baik dan lebih komplet. Yang kita bahas di sini semoga berguna sebagai pengantar untuk membawa Anda lebih jauh mencari tahu tentang pemrograman dengan jaringan.


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 <server>");
           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 PrintWriter untuk mengirim data melalui koneksi yang terjadi.
Server akan menulis tanggal dan waktu sekarang pada aliran output ini, kemudian menutup koneksi. (Kelas standar java.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 <nama_direktori_tempat_proyek_server_berada>\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 <nama_direktori_tempat_proyek_klien_berada>\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 :

 


 

 

 

0 komentar:

Posting Komentar

  • RSS
  • Delicious
  • Digg
  • Facebook
  • Twitter
  • Linkedin

Search Site

 
  • Blogroll

  • Consectetuer

  • Popular

  • Comments