Kamis, 15 Desember 2011

Soket, Klien, dan Server (Java)


Komunikasi melalui internet dilakukan berdasarkan sepasang protokol yang dinamakan Internet Protocoldan 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 bertipeSocket 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.comatau 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 kelasServerSocket 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 baruberiLayanan(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() dangetOutputStream() 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.

Tidak ada komentar:

Posting Komentar