Pada kesempatan kali ini, kami diberikan tugas oleh Bp. Untung Subagyo, S.Kom sebagai dosen pengapu mata kuliah Pemrograman Jaringan, untuk mendalami tentang pemrograman socket yang digunakan untuk mengirimkan pesan teks dari aplikasi klien ke server, begitu juga sebaliknya. Tugas tersebut diterbitkan di blog beliau.

Belajar Pemrograman Socket
Namun sebelum kita beranjak ke tahap coding, alangkah baiknya jika kita mengenal terlebih dahulu beberapa statement / class java yang akan kita gunakan nanti. Apa yang dikatakan oleh pepatah memang ada benarnya, "TAK KENAL MAKA TAK SAYANG"
1. Mengenal Penggunaan Paket Library / Datagram dan Class
import
Pernyataan ini digunakan untuk mengimpor(mendatangkan) fungsi/method, objects/class, maupun tipe data primitif, yang terdapat pada paket libary tertentu.
java.io
Adalah paket library yang diperlukan untuk melakukan input / output (I/O) data di java. Semua bentuk aliran(Stream) selalu merepresentasikan sumber input dan destinasi output. Nah begitu juga dengan Stream(aliran) paket libary java.io yang didefinisikan dengan;
- InputStream, yaitu class yang digunakan untuk membaca data dari sumber (variabel).
- OutputStream, yaitu class yang digunakan untuk menulis data ke destinasi (variabel).
Selain itu paket java.io juga mendukung banyak data seperti primitif, objek, karakter lokal, dll.
InputStream
Adalah abstract class sebagai superclass yang mewakili aliran input byte. Aplikasi yang mendefinisikan subclass dari InputStream harus selalu menyertakan method yang mengembalikan byte berikutnya dari input.
getInputStream()
Method ini digunakan untuk mengembalikan InputStream mewakili data dan exeption yang dilemparkan (throws IOException). - Perhatian! sebuah new InputStream object harus dikembalikan setiap kali method ini disebut, dan stream harus diposisikan di awal data.
OutputStream
Adalah abstract class sebagai superclass yang mewakili aliran output byte. Aplikasi yang mendefinisikan subclass dari OutputStream harus selalu menyertakan method yang setidaknya menulis satu byte ke output.
getOutputStream()
Method ini digunakan untuk mengembalikan OutputStream, yang mana mewakili penulisan data dan exeption yang dilemparkan (throws IOException). Perhatian! sebuah new OutputStream object harus dikembalikan setiap kali method ini disebut, dan stream harus diposisikan pada lokasi data yang akan ditulis.
java.net
Adalah paket libary dari API J2SE yang berisi kumpulan class dan interface yang menyediakan detail komunikasi aras(tingkat) rendah.
Pemrograman jaringan merujuk pada penulisan program yang mengeksekusi beberapa perangkat(komputer), yang mana semua perangkat tersebut saling terhubung dengan jaringan.
Paket library java.net menyediakan dukungan dua protokol jaringan seperti:
- TCP - TCP, adalah singkatan dari Transmission control Protocol, yang memungkinkan untuk bisa berkomunikasi dengan handal antara dua aplikasi. TCP biasa digunakan via Internet Protocol, maka dari itu disebut sebagai TCP/IP.
- UDP - UDP, adalah singkatan dari User Datagram Protocol, yaitu sebuah connection-less protocol yang memungkinkan paket data ditransmisikan ke banyak aplikasi
Socket
Adalah class yang terdapat di paket java.net yang mengimplementasikan salah satu sisi koneksi dua arah antara program java dan program lain pada jaringan. Formatnya → Socket(String host, int port).
byte[]
Mengambil semua atau sebagian dari nilai BLOB, dimana BLOB ini adalah perwakilan dari objek array byte.
try ... catch
Adalah statement pada java yang digunakan untuk menangani pesan error, dan dapat melanjutkan jalannya program tanpa harus berhenti karena error. Error yang ditangani try..catch bisa disebut dengan exeption. Formatnya → try{} catch(){}
IOException
Adalah sebuah pengecualian I/O dari alur program. Ini merupakan class umum exception yang dibuat untuk mengatasi kegagalan operasi I/O.
Exception adalah kondisi yang menyebabkan program menjadi hang atau keluar (quit) dari alur normal yang telah ditentukan saat program dijalankan. Exception ini dipicu oleh Runtime Error, yaitu error yang terjadi pada saat program dieksekusi oleh interpreter. Misalnya:
- Pemasukkan data karakter ketika meminta masukan berupa data bilangan
- Terjadi pembagian dengan nol
- Path atau lokasi file yang diberikan tidak sesuai.
- Operasi untuk mengakses variabel array pada nomor indeks di luar batas
read()
Digunakan untuk membaca byte berikutnya dari inputstream. Nilai byte dikembalikan sebagai integer berkisar 0 sampai 255. Jika tidak ada byte lagi karena proses pembacaan sudah sampai akhir stream, maka nilai -1 dikembalikan. Blok Method ini akan dikerjakan mulai dari input data tersedia hingga akhir stream, atau sampai exeption.
write()
Digunakan untuk menulis byte yang sudah ditentukan di OutputStream.
java.util.Arrays.fill(int[] a, int val)
Method yang menugaskan nilai int tertentu kepada setiap elemen array tertentu.
Parameter:
- a → Array yang akan diisi
- val → Nilai yang akan disimpan dalam semua elemen array.
string.trim()
Disebut dengan Java String Trim, adalah method yang digunakan untuk menghilangkan spasi atau mengeliminasi karakter tertentu pada suatu string. Anda bisa melihat demonya diSINI dan diSINI.
string.equals()
Method yang digunakan untuk membandingkan string ke objek tertentu. Hasilnya akan benar jika dan hanya jika argumennya tidak null dan merupakan objek string yang mewakili urutan karakter yang sama sebagai objek.
2. Memulai dengan Coding
Dalam hal ini, saya asumsikan teman-teman semua sudah menginstall Netbeans IDE, maka silakan buat project berikut;
2.a. Membuat Project Client
package com.gatewan.client;
import java.io.*;
import java.net.*;
public class ComGatewanClient {
public static void main(String[] args) throws IOException {
// TODO code application logic here
Socket client = null; //deklarasi objek socket dengan nama client
InputStream in = null; //deklarasi objek InputStream dengan nama in
OutputStream out = null; //deklarasi objek OutputStream dengan nama out
byte[] receiveMessage = new byte [64];
try {
client = new Socket ("localhost",8881); /*untuk membuat sebuah stream socket dan juga koneksi ke
suatu port tertentu pada sebuah komputer berdasar namanya.
Formatnya adalah --> Socket(String host, int port)
*/
in=client.getInputStream(); //mengisi objek in dengan input dari client
out=client.getOutputStream(); //menulis obje
} catch (IOException e) {
System.out.println(e.getMessage());System.exit(-1);
}
/*try..catch adalah statement pada java yang digunakan untuk menangani pesan error,
dan dapat melanjutkan jalannya program tanpa harus berhenti karena error.
Error yang ditangani try..catch bisa disebut dengan exeption.*/
String fromServer;
String fromUser;
in.read(receiveMessage);
fromServer = new String(receiveMessage);
System.out.println("Server:"+fromServer);
fromUser = "Salam dari Client";
System.out.println("Kirim ke server :"+fromUser);
out.write(fromUser.getBytes());
fromUser = "Ini data dari Client";
System.out.println("Kirim ke server :"+fromUser);
out.write(fromUser.getBytes());
fromUser = "Keluar";
System.out.println("Kirim ke server :"+fromUser);
out.write(fromUser.getBytes());
out.close();in.close();client.close();
}
}
2.b. Membuat Project Server
package com.gatewan.server;
import java.io.*;
import java.net.*;
public class ComGatewanServer {
public static void main(String[] args) throws IOException{
// TODO code application logic here
ServerSocket server = null;
Socket client = null;
byte[] receiveBuf = new byte[64];
int receiveMesssageSize;
try {
server = new ServerSocket(8881);
System.out.println("Server Started");
client = server.accept();
System.out.println("Client terkoneksi");
} catch (IOException e) {
System.out.println(e.getMessage()); System.exit(-1);
}
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
String data;
data = "Salam dari server";
out.write(data.getBytes());
java.util.Arrays.fill(receiveBuf, (byte)0);
while(true){
receiveMesssageSize = in.read(receiveBuf);
data = new String (receiveBuf);
if(data.trim().equals("Keluar")){
out.write(data.getBytes());break;
}
java.util.Arrays.fill(receiveBuf, (byte)0);
System.out.println("Client :" +data);
}
out.close();in.close();client.close();server.close();
}
}
3. Eksekusi Program
Hal pertama yang harus dijalankan adalah Server, berikutnya Client. Jika langkah ini Anda balik, maka Client error karena tidak ada lawan komunikasi.

Server dijalankan

Client dijalankan

Respon Server
Ini adalah contoh eksekusi dengan rule yang salah. Client menghubungi Server mati.

Client tidak dapat berkomunikasi dengan Server MATI
Referensi: