Tutorial Socket Programming with JAVA

Bayangkan bagimana sulitnya membuat program yang dapat berkomunikasi satu dengan lainnya lewat jaringan. Programmer harus mampu membuat antar muka di program tersebut yang dapat mengakses hardware jaringannya. Namun, untuk sekarang ini kita dapat menggunakan suatu antar muka yang sudah jadi yaitu Socket.
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:

Dawud Tan said...

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