Pertemuan ke-2 JAVA SOCKET A. TUJUAN : Dapat mengimplementasi-kan kelas-kelas Java yang digunakan dalam pemrogaman jaringan. B. TEORI SINGKAT Tentang Socket Socket adalah sebuah abstraksi perangkat lunak yang digunakan sebagai suatu "terminal" dari suatu hubungan antara dua mesin atau proses yang saling berinterkoneksi. Di tiap mesin yang saling berinterkoneksi, harus terpasang socket. Socket biasa digunakan untuk pemrograman berbasis client-server yang dapat menggunakan socket TCP atau socket UDP. Pada J2SE telah disediakan paket java.net yang berisi kelas-kelas dan interface yang menyediakan API (Application Programming Interface) level rendah (Socket, ServerSocket, DatagramSocket) dan level tinggi (URL, URLConnection). Socket adalah mekanisme komunikasi yang memungkinkan terjadinya pertukaran data antar program atau proses baik dalam satu mesin maupun antar mesin. Gambar 2.1 Ilustrasi socket yang membangun komunikasi antar proses yang sama-sama aktif. Kelas Socket Sebuah kelas yang digunakan oleh client untuk inisialisasi koneksi dengan server (kelas ServerSocket) menggunakan protocol TCP. Ketika sebuah socket dibuat, maka sebuah koneksi akan terbentuk ke suatu mesin atau proses yang dituju. Pada java, kelas Socket memiliki kurang lebih 8 buah konstruktor berikut ini beberapa contoh konstruktornya: 1. Socket(InetAddress address, int port) Membuat sebuah stream socket dan koneksi ke suatu nomor port pada suatu komputer yang memiliki alamat IP. 2. Socket(String Host,int port) Membuat stream socket dan juga koneksi ke suatu port komputer berdasarkan nama komputernya. 3. Socket(String host,int port,inetaddress localaddr,int localport); Membuat sebuah socket dan mengkoneksikannya ke port yang dituju pada alamat IP yang disebutkan pada parameter nama host berikut melakukan bind socket ke alamat local dan port lokal. (Jika koneksi antara client dan server membutuhkan nomor port yang sudah ditentukan. Selain konstruktor terdapat beberapa method dari kelas Socket yaitu: 1. getinputstream() Mengembalikan objek input stream dari socket yang dapat di tampung pada objek dari kelas DataInputStream. 2. getoutputstream() Praktikum Pemrograman Jaringan - TK 1
Mengembalikan objek output stream ke socket yang dapat di tampung pada objek dari kelas DataOutputStream. 3. close() Memberitahukan ke protocol untuk menutup koneksi. 4. getinetaddress() Mendapatkan nama host yang dituju dan alamat IP-nya. 5. getport() Mendapatkan nomor port remote host. 6. getlocalport() Mendapatkan nomor port localhost. 7. getlocaladdress() Mendapatkan alamat local dimana socket digunakan. 8. setsotimeout(int timeout) dan getsotimeout(), Kedua method tersebut digunakan untuk memberi (set) dan mengambil (get) nilai opsi Socket untuk time-out block reading (dalam mili detik) dari socket (SO_TIMEOUT). Jika dalam waktu time-out tidak mendapat suatu nilai maka, akan dilemparkan ke exception java.net. SocketTimeoutException. Nilai default time-out adalah 0, yang berarti tanpa batas. 9. setsendbuffersize(int size) dan getsendbuffersize(), Method ini akan mengatur dan mengambil informasi tentang ukuran buffer SO_SNDBUF, yaitu buffer untuk pengiriman. Ukuran ini juga harus disesuaikan ukuran buffer pada level network. ServerSocket Digunakan oleh Server untuk listen koneksi dari klien menggunakan protocol TCP, dimana setelah client terkoneksi ke server dengan menggunakan Socket, maka ServerSocket akan mengembalikan status server ke klien melalui koneksi yang terbentuk sebelumnya. Tipe koneksi aplikasi yang dibangun dengan kelas ServerSocket ini adalah Connection Oriented. Ketika dibuat objek baru dari kelas ServerSocket, agar dapat mengirim dan menerima melalui stream, tetap perlu dibuat InputStream dan OutputStream dari objek Socket yang dihasilkan ketika dari kelas ServerSocket menerima permintaan dari client melalui method accept(). Kelas ServerSocket memiliki suatu konstruktor yang menerima sebuah nomor Port yang akan digunakan sebagai nomor akses layanan yang disediakannya, yaitu: ServerSocket(int port [, int backlog [, InetAddress bindaddress ]] ); Konstruktor diatas membuat sebuah server dengan port tertentu, batasan jumlah antrian (backlog), dan alamat IP bindaddress. Gambar 2.2 Ilustrasi koneksi aplikasi client dengan aplikasi server Serupa dengan kelas Socket, pada kelas ServerSocket juga menyediakan beberapa method ini: accept(), akan menghasilkan sebuah objek kelas Socket yang terkoneksi dengan klien. close(), akan menutup sesi listen untukpermintaan yang datang dari socket client. C. PRAKTIK : 1. Contoh penggunaan kelas Socket: import java.io.*; Praktikum Pemrograman Jaringan - TK 2
import java.net.*; public class ExHTTPClient public static void main(string args[]) try Socket clientsocket = new Socket("localhost", 80); System.out.println("Client: "+ clientsocket); System.out.println("###########################"); gethtml(clientsocket,"/test.html"); catch (UnknownHostException e) System.out.println(e); catch (IOException e) System.err.println(e); public static void gethtml(socket clientsocket, String filename) try DataOutputStream outbound = new DataOutputStream(clientSocket.getOutputStream() ); DataInputStream inbound = new DataInputStream(clientSocket.getInputStream() ); outbound.writebytes("get "+ filename + " HTTP/1.0\r\n\r\n"); String responseline; while ((responseline = inbound.readline())!= null) System.out.println(responseLine); outbound.close(); inbound.close(); clientsocket.close(); catch (IOException e) System.out.println(e); File test.html <html> <head> <title>test Dokumen HTML</title> </head> <body bgcolor="lavender"> <b>test Dokumen HTML yang Pertama</b> </body> </html> 2. Contoh aplikasi yang menggunakan kelas ServerSocket: Program Server import java.io.bufferedreader; import java.io.dataoutputstream; import java.io.ioexception; import java.io.inputstreamreader; import java.net.inetaddress; import java.net.serversocket; Praktikum Pemrograman Jaringan - TK 3
import java.net.socket; import java.net.socketexception; import java.util.date; public class ProgramServer private final int NOMOR_PORT=8080; private String datadariclient; publicprogramserver() BufferedReaderinputDariClient; DataOutputStreamoutputKeClient; Socket serversocket; try ServerSocketinfoServer = new ServerSocket(NOMOR_PORT); System.out.println("Server telahsiap...!"); while(true) serversocket = infoserver.accept(); System.out.println("Ada client yang terkoneksi...!"); inputdariclient = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()) ); outputkeclient = new DataOutputStream(serverSocket.getOutputStream()); outputkeclient.writebytes("infoserver versi0.1\n"+ "hanyauntuk testing..\n"+ "SilahkanberikanperintahTIME NET Quit\n"); booleanisquit = false; while (!isquit) datadariclient = inputdariclient.readline(); if(datadariclient.startswith("time")) outputkeclient.writebytes(new Date().toString()+"\n"); else if (datadariclient.startswith("net")) outputkeclient.writebytes(inetaddress.getbyname("localhost"). tostring()+"\n"); else if(datadariclient.startswith("quit")) isquit = true; outputkeclient.close(); inputdariclient.close(); serversocket.close(); catch(exception e) System.out.println("Error:" +e); public static void main(string[] args) new ProgramServer(); Program Klien import java.io.bufferedreader; import java.io.dataoutputstream; import java.io.ioexception; import java.io.inputstreamreader; import java.net.socket; public class ProgramClient private final int NOMOR_PORT=1234; private final String TARGET_HOST="localhost"; Praktikum Pemrograman Jaringan - TK 4
private final String QUIT="QUIT"; publicprogramclient() try BufferedReaderinputDariUser = new BufferedReader(new InputStreamReader(System.in) ); Socket clientsocket = new Socket(TARGET_HOST,NOMOR_PORT ); DataOutputStreamoutputKeServer = new DataOutputStream(clientSocket.getOutputStream() ); BufferedReaderinputDariServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()) ); booleanisquit = false; while (!isquit) System.out.print("PerintahAnda :"); String cmd = inputdariuser.readline(); cmd = cmd.touppercase(); if (cmd.equals(quit)) isquit = true; outputkeserver.writebytes(cmd +"\n"); String result = inputdariserver.readline(); System.out.println("Dari Server :"+ result); outputkeserver.close(); inputdariserver.close(); clientsocket.close(); catch (Exception e) System.out.println("Error:"+e); public static void main(string[] args) newprogramclient(); D. LATIHAN Akan disampaikan oleh Dosen Pengampu saat praktikum. E. TUGAS Akan disampaikan oleh Dosen Pengampu saat praktikum. Praktikum Pemrograman Jaringan - TK 5