Socket adalah sebuah Class yang disediakan oleh beberapa bahasa pemrograman. Dengan socket, sebuah aplikasi di suatu komputer dapat membuka koneksi untuk menghubungi aplikasi lain di komputer lainnya. Tentu saja aplikasi di komputer yang dihubungi menerima koneksi juga menggunakan socket. Dengan kata lain socket adalah suatu Class yang digunakan oleh aplikasi untuk saling berhubungan. Gambar 4.1 berikut ini menunjukkan bagaimana suatu aplikasi berhubungan dengan aplikasi lainnya
Gambar 4.1. Komunikasi antar aplikasi menggunakan socket
Paradigma pada aplikasi jaringan berlaku model client-server. Aplikasi yang menginisialisasi koneksi, disebut aplikasi client. Sedangkan aplikasi yang menerima inisialisasi disebut sebagai aplikasi server. Oleh karena itu, jika kita membangun suatu aplikasi jaringan yang lengkap, maka kita harus membuat aplikasi client maupun aplikasi server.
Lebih lanjut mengenai socket, ada dua jenis socket yang bisa digunakan untuk membangun aplikasi, yakni TCP Socket dan UDP Socket. Perbedaan utamanya adalah, di model TCP digunakan konsep connection oriented dan reliable data transfer, sedangkan di model UDP digunakan konsep connectionless oriented dan unreliable data transfer. Sebuah aplikasi dapat menggunakan salah satu dari jenis Socket tersebut disesuaikan dengan peruntukan aplikasi tersebut. Aplikasi berbasis TCP biasanya adalah aplikasi yang membutuhkan ketepatan data hingga 100% tapi tidak memperdulikan lama pengiriman, sedangkan aplikasi berbasis UDP biasanya adalah aplikasi yang tidak terlalu mempedulikan ketepatan data tapi sangat peduli dengan delay pengiriman. Contoh aplikasi TCP adalah web browser, sedangkan UDP adalah Video Converence.
Untuk membangun aplikasi hal pertama yang perlu dilakukan adalah menganalisa jenis aplikasi kita, kebutuhan bandwidth, kebutuhan ketersampaian data dan sensitifitas terhadap delay. Berdasarkan hal ini kita bisa menentukan protokol apa yang kita gunakan, entah TCP atau UDP.
Pemrograman Socket menggunakan TCP
Cara kerja aplikasi yang menggunakan TCP dapat digambarkan oleh Gambar 4.2 di bawah ini:
Gambar 4.2. Cara kerja aplikasi client dan server menggunakan TCP
Detil dari proses tersebut adalah:
- Untuk bisa melakukan koneksi client server, program server harus berjalan terlebih dahulu
- Di sisi server disediakan sebuah socket, yang disebut welcoming socket yang fungsinya untuk mendeteksi adanya permintaan koneksi dari sisi client.
- Di sisi client terdapat client socket. Jika ingin menghubungi server, maka melalui client socket-nya, client membuat inisialisai koneksi ke welcoming socket milik server, dengan mode three-way handshake.
- Setelah welcoming socket menerima inisialisasi koneksi dari client socket, aplikasi server akan membuat connection socket di sisi server. Dengan connection socket ini, client socket dan connection socket berinteraksi satu sama lain untuk mengirim dan menerima data.
Berikut adalah contoh aplikasi TCP dengan skenario:
- Client membaca inputan dari keyboard, kemudian mengirimkan hasilnya ke server melalui socket-nya.
- Server membaca data yang dikirim oleh client di connection socket
- Server mengubah data menjadi huruf besar
- Server mengirimkan data yang telah diubah menuju client melalui connection socket-nya.
- Client membaca data yang dikirim oleh server dari client socket-nya. Kemudian menampilkan data tersebut di monitor
Berikut adalah script aplikasi client berbasis Java untuk kasus di atas
TCPClient.java
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
}
}
Berikut adalah script aplikasi server berbasis Java untuk kasus di atas
TCPServer.java
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String argv[]) throws Exception
{
String clientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while(true) {
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
}
}
Pemrograman Socket menggunakan UDP
Contoh aplikasi untuk UDP socket berikut ini menggunakan kasus yang sama dengan kasus yang digunakan oleh TCP socket, yakni:
- Client membaca inputan dari keyboard, kemudian mengirimkan hasilnya ke server melalui socket-nya.
- Server membaca data yang dikirim oleh client di connection socket
- Server mengubah data menjadi huruf besar
- Server mengirimkan data yang telah diubah menuju client melalui connection socket-nya.
- Client membaca data yang dikirim oleh server dari client socket-nya. Kemudian menampilkan data tersebut di monitor
Berikut adalah script aplikasi client berbasis Java untuk kasus di atas
UDPClient.java
import java.io.*;
import java.net.*;
class UDPClient {
public static void main(String args[]) throws Exception
{
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
Berikut adalah script aplikasi server berbasis Java untuk kasus di atas
UDPServer.java
import java.io.*;
import java.net.*;
class UDPServer {
public static void main(String args[]) throws Exception
{
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}
}
Perbedaan utama antara aplikasi berbasis TCP dengan aplikasi berbasis UDP adalah di aplikasi UDP tidak ada welcoming socket. Pada UDP tidak ada socket khusus untuk permintaan inisialisai koneksi. Setiap data yang datang ditangani lansung oleh server socket.