Apabila kita ingin mengirimkan sebuah Object ke komputer lain, tentunya kita membutuhkan jalur komunikasi antar aplikasi. Salah satu penerapannya menggunakan Socket. Disini saya tidak akan menjelaskan tentang pemanggilan method di komputer lain, tapi hanya tentang kirim-mengirim data antar 2 aplikasi yang berada di komputer berbeda. Dengan menggunakan java tentunya.
Dalam menggunakan socket harus ada yang berperan sebagai server dan ada yang berperan sebagai client. Tugas sever dalam hal ini adalah membuka sebuah port dan menunggu request dari client. Sedangkan client harus mengetahui alamat server dan port yang dibuka oleh server lalu mengirimkan request. Maka akan terjadilah jalur komunikasi antara server dan client.
Server dapat membuka port dan menunggu dengan program sederhana seperti ini:
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(9999);
Socket socket = server.accept();
}
}
apabila server diatas punya alamat di 192.168.1.1 maka di sisi client kita bisa membuat:
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("192.168.1.1", 9999);
}
}
Sekarang kita ingin agar bisa saling menulis dalam bentuk Object, maka pada sisi Server maupun Client harus kita tambahkan:
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.close();
in.close();
Misalnya kita ingin saling berkiriman dalam bentuk String, maka pada sisi server lengkapnya:
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(9999);
Socket socket = server.accept();
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Object obj = in.readObject();
String str = "";
if (obj instanceof String) {
str = (String) obj;
System.out.println(str);
}
out.writeObject(str + " juga");
out.close();
in.close();
}
}
pada client:
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("192.168.1.1", 9999);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
out.writeObject(new String("Hallo"));
Object obj = in.readObject();
if (obj instanceof String) {
String str = (String) obj;
System.out.println(str);
}
out.close();
in.close();
}
}
Cobalah dan perhatikan output di sisi server maupun client. Bagaimana dengan Object selain String, misalnya Karyawan? Semua Object dapat dibaca dengan metode diatas dengan syarat Object tersebut harus Serializable. Jadi Karyawan harus implements java.io.Serializable agar bisa dikirim melalui socket.
Jika kita perhatikan pada program diatas, program server akan berhenti menunggu apabila ada client yang terkoneksi. Dengan berhentinya dia menunggu, maka akan sampai pada akhir program dan keluar. Untuk membuatnya menunggu lagi setelah melayani sebuah client, tentu saja kita membutuhkan perulangan. Dengan perulangan, kita bisa membuat server kembali ke perintah server.accept. Dalam contoh diatas server juga tidak bisa menerima multiple request. Untuk bisa membuatnya multiple request kita harus melakukan threading terhadap penanganan request, sehingga server akan selalu siap untuk accept.