Socket yang dimaksud di sini adalah sebuah API (Aplication Programmable Interface), memungkinkan sebuah program dapat menggunakan antarmuka jaringan dan berkomunikasi dengan program lain. API yang akan kita gunakan adalah Socket API dari library java.net.
Dalam tutorial ini, kita akan menggunakan sebuah contoh permasalah sebagai berikut. Pertama, sebuah program yang bertindak sebagai Client akan meminta inputan ke pengguna berupa sebuah tanggal dalam format dd-mm-yyyy. Tanggal tersebut dikirimkan ke program lain yang menjadi Server dengan menggunakan Socket. Program Server kemudian akan memproses tanggal tersebut, dan mengembalikan sebuah nilai yaitu umur dari tanggal tersebut ke Client.
Pada tutorial kali ini, program Java akan di compile dengan IDE NetBeans.
Program Requester akan bertindak sebagai Client dan program Provider akan bertindak sebagai Server.
Program Requester (Client)
package requester; import java.io.*; import java.net.*; import java.util.Scanner; public class Requester{ // socket digunakan untuk berkomunikasi antar program Socket requestSocket; // outputstream digunakan untuk mengirim message ke socket. inputstream untuk mengambil pesan dari socket // menggunakan ObjectStream karena setiap Input/Output dari Stream akan berupa sebuah object yaitu string ObjectOutputStream out; ObjectInputStream in; // string untuk menyimpan pesan yang dikirim/diterima String message; Requester(){} void run() { try{ // buat socket baru yang melakukan request ke localhost port 1337 requestSocket = new Socket("localhost", 1337); // set input dan output stream dari socket yang digunakan out = new ObjectOutputStream(requestSocket.getOutputStream()); out.flush(); in = new ObjectInputStream(requestSocket.getInputStream()); System.out.println("Terhubung dengan localhost port 1337"); Scanner sc = new Scanner(System.in); System.out.print("Masukkan tanggal lahir anda (dd-mm-yyyy) : "); // meminta masukan tanggal dari pengguna message = sc.next(); // mengirim pesan (lihat fungsi sendMessage) sendMessage(message); try { // lakukan pembacaan message dari input stream message = (String)in.readObject(); // cetak message yang didapat System.out.println("Anda berumur " + message + " tahun"); } // untuk setiap input/output object stream, diperlukan blok try-catch, NetBeans akan mengingatkan developernya by default catch (ClassNotFoundException ex) { System.err.println("ERROR! ClassNotFoundException"); } } catch(IOException ioException){ ioException.printStackTrace(); } // blok finally akan dijalankan jika blok try selesai dijalankan finally{ // blok ini akan menutup semua koneksi dan me-reset Input/outputstream // proses ini juga harus dalam blok try-catch try{ in.close(); out.close(); requestSocket.close(); } catch(IOException ioException){ ioException.printStackTrace(); } } } void sendMessage(String msg) { try{ out.writeObject(msg); // setelah message disimpan dalam buffer output stream, segera lakukan flush agar langsung dikirimkan ke socket tujuan out.flush(); } catch(IOException ioException){ ioException.printStackTrace(); } } public static void main(String args[]) { Requester client = new Requester(); client.run(); } }Program Provider (Server)
package provider; import java.io.*; import java.net.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class Provider{ // serversocket adalah sebuah socket yang akan menunggu hingga ada request koneksi dengan socket ini ServerSocket providerSocket; // socket digunakan untuk berkomunikasi antar program Socket connection = null; // outputstream digunakan untuk mengirim message ke socket. inputstream untuk mengambil pesan dari socket // menggunakan ObjectStream karena setiap Input/Output dari Stream akan berupa sebuah object yaitu string ObjectOutputStream out; ObjectInputStream in; // string untuk menyimpan pesan yang dikirim/diterima String message; Provider(){} void run() { try{ // buat sebuah Serversocket baru yang akan menunggu request ke sebuah port. formatnya new ServerSocket(no_port_yang_digunakan) providerSocket = new ServerSocket(1337); // program akan menunggu hingga ada request ke server socket yang dibaca oleh socket connection connection = providerSocket.accept(); System.out.println("Terhubung dengan localhost port 1337"); // set input dan output stream dari socket yang digunakan out = new ObjectOutputStream(connection.getOutputStream()); out.flush(); in = new ObjectInputStream(connection.getInputStream()); try{ // lakukan pembacaan message dari input stream message = (String)in.readObject(); int umur = hitungUmur(message); message = Integer.toString(umur); sendMessage(message); } // untuk setiap input/output object stream, diperlukan blok try-catch, NetBeans akan mengingatkan developernya by default catch(ClassNotFoundException classnot){ System.err.println("ERROR! ClassNotFoundException"); } } catch(IOException ioException){ ioException.printStackTrace(); } // blok finally akan dijalankan jika blok try selesai dijalankan finally{ // blok ini akan menutup semua koneksi dan me-reset Input/outputstream // proses ini juga harus dalam blok try-catch try{ in.close(); out.close(); providerSocket.close(); } catch(IOException ioException){ ioException.printStackTrace(); } } } void sendMessage(String msg) { try{ out.writeObject(msg); // setelah message disimpan dalam buffer output stream, segera lakukan flush agar langsung dikirimkan ke socket tujuan out.flush(); } catch(IOException ioException){ ioException.printStackTrace(); } } int hitungUmur(String tgl) { String dob = tgl; // parsing dari string dd-mm-yyyy, dipecah masing masing bagian menjadi integer int yearDOB = Integer.parseInt(dob.substring(6)); int monthDOB = Integer.parseInt(dob.substring(3,5)); int dayDOB = Integer.parseInt(dob.substring(0,2)); // dapatkan tahun saat ini DateFormat dateFormat = new SimpleDateFormat("yyyy"); Date date = new Date(); int thisYear = Integer.parseInt(dateFormat.format(date)); // dapatkan bulan saat ini dateFormat = new SimpleDateFormat("MM"); date = new Date(); int thisMonth = Integer.parseInt(dateFormat.format(date)); // dapatkan hari saat ini dateFormat = new SimpleDateFormat("dd"); date = new Date(); int thisDay = Integer.parseInt(dateFormat.format(date)); boolean kabisat = true; // pada awalnya, umur adalah tahun sekarang - tahun kelahiran int age = thisYear - yearDOB; // pengecekan kasus tahun kabisat if(thisMonth >= 2) kabisat = cekKabisat(thisYear); // jika ternyata lahir 29 februari sementara sekarang tidak kabisat, umurnya dikurangi 4 if (monthDOB == 2 && dayDOB == 29 && !kabisat) age = age-4; // jika bulannya belum melebihi bulan ulang tahunnya, atau jika bulannya sudah masuk bulan ulang tahunnya tapi harinya belum tepat, umurnya dikurang 1 tahun lagi (belum berulang tahun) else if (thisMonth < monthDOB || (thisMonth == monthDOB && thisDay < dayDOB)) --age; return age; } boolean cekKabisat(int thn) { if (thn % 4 == 0) { if (thn % 100 == 0) { if (thn % 400 == 0) return true; else return false; } else return true; } else return false; } public static void main(String args[]) { Provider server = new Provider(); server.run(); } }
1 comments:
permisi gan, saya ada sedikit tulisan mengenai implementasi websocket di java gan, kalau berkenan silahkan dijadikan rujukan gan, semoga bermanfaat http://datacomlink.blogspot.co.id/2015/11/implementasi-server-websocket-rfc-6455.html terima kasih gan sebelumnya atas perhatiannya
Post a Comment