Sabtu, 09 Oktober 2010

Mendeteksi Terputusnya Koneksi dalam Remote Method Invocation


RMI (Remote Method Invocation) merupakan salah satu teknologi dalam Java yang dapat digunakan untuk membangun aplikasi berbasis client-server. Dalam membangun aplikasi client-server, kita tidak bisa menjamin bahwa koneksi jaringan akan selalu stabil. Bisa saja suatu waktu koneksi terputus. Lantas bisakah kita mendeteksi ketika koneksi dari client ke server terputus?
Pasti bisa, karena dalam RMI setiap metode yang di remote akan mengeluarkan error RemoteException, sehingga jika terjadi error tersebut, maka otomatis jaringan terputus. Namun jika kita membangun kelas dengan banyak metode, maka apa kita harus mengecek di semua metode?
Enggak juga. Kita bisa membuat sebuah remote method ping() yang dapat kita gunakan untuk melakukan proses ping ke server, jika proses ping tersebut gagal, maka otomatis koneksi ke server terputus, dan saat itu kita jalankan di client aksi saat koneksi terputus, misal memberi tahu pengguna client bahwa koneksi terputus.
Jadi bagaimana cara pembuatannya? Pertama buatlah sebuah interface Ping yang digunakan untuk melakukan ping.
package khannedy.rmi.api;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Ping extends Remote {

 void ping() throws RemoteException;

}
Setelah membuat interface Ping, buat pulang implementasi Ping di server.
package khannedy.rmi.server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import khannedy.rmi.api.Ping;

public class PingServer extends UnicastRemoteObject implements Ping {

 private static final long serialVersionUID = 1L;

 public PingServer() throws RemoteException {
  super();
 }

 @Override
 public void ping() throws RemoteException {
  // do nothing
 }

}
Buatlah sebuah listener di client untuk mendeteksi ketika proses Ping gagal atau disconnect.
package khannedy.rmi.client;

public interface PingListener {

 void onDisconnect();

}
Sekarang saatnya membuat class PingClient, dimana kelas ini merupakan kelas yang melakukan proses pengecekan menggunakan Thread secara realtime dan continue. Jadi ketika proses ping gagal, maka listener akan ditrigger.
package khannedy.rmi.client;

import java.rmi.RemoteException;

import khannedy.rmi.api.Ping;

public class PingClient implements Runnable {

 private Ping ping;
 private Thread thread;
 private PingListener listener;

 public PingClient(Ping ping) {
  this.ping = ping;
  thread = new Thread(this);
 }

 public void startPing(PingListener listener) {
  this.listener = listener;
  thread.start();
 }

 @Override
 public void run() {
  try {
   while (true)
    ping.ping();
  } catch (RemoteException e) {
   listener.onDisconnect();
  }
 }

}
Seakarang di client, kita bisa menggunakan PingClient menggunakan kode seperti dibawah ini :
Ping ping = (Ping) registry.lookup("ping");

PingClient client = new PingClient(ping);
client.startPing(new PingListener() {

 @Override
 public void onDisconnect() {
  System.out.println("Ups, Server Disconnect");
 }
});

Tidak ada komentar:

Posting Komentar

Powered By Blogger

Search For All