Tugas pak achsan 2 – program komunikasi antar proses dengan soket


Socket adalah sebuah abstraksi perangkat lunak yang digunakan sebagai suatu “terminal” dari suatu hubungan antara dua mesin atau proses yang saling berinterkoneksi.

Di tiap mesin yang saling berinterkoneksi, harus terpasang socket.

Pada J2SE telah disediakan paket java.net yang berisi kelas- kelas dan interface yang menyediakan API (Application Programming Interface) level rendah (Socket, ServerSocket, DatagramSocket) dan level tinggi (URL, URLConnection).

 

Socket akan membangun komunikasi antar proses yang sama-sama aktif.

Ilustrasinya adalah :

 

 

 

Kelas java.net.ServerSocket digunakan oleh Server untuk listen koneksi, sedangkan java.net.Socket digunakan oleh Client untuk inisialisasi koneksi. Setelah client terkoneksi ke server dengan menggunakan Socket, maka ServerSocket akan mengembalikan status server ke client melalui koneksi yang terbentuk sebelumnya.

Untuk pemrograman Socket Connection Oriented menggunakan kelas java.net.ServerSocket dan java.net.Socket

Untuk pemrograman Socket Connectionless Oriented menggunakan kelas java.net.DatagramSocket.

 

 

Kelas java.net.InetAddress

Kelas ini digunakan untuk mengambil informasi IP suatu komputer. Kelas ini bersifat static dan tidak memiliki konstruktor. Method-methodnya adalah:

– getByName(namahost) yang akan menerima sebuah string nama host dan

mengembalikan alamat IP sebelumnya.

– getLocalHost() yang akan mengembalikan alamat IP dan nama host pada

komputer lokal.

Contoh :

import java.net.*;

public class AmbilIP {

public static void main(String[] args) {

try {

InetAddress ip =

InetAddress.getByName(“localhost”);

System.out.println(ip.getHostAddress());

System.out.println(ip.getHostName());

}

catch(UnknownHostException e) {

System.out.println(e);

}

}

}

 

Kelas java.net.Socket

Kelas ini digunakan untuk melakukan koneksi ke suatu mesin atau proses yang dituju.

 

Socket(InetAddress address, int port);

Membuat sebuah stream socket dan koneksi ke suatu nomor port pada sebuah komputer

yang memiliki alamat IP.

 

Socket(String host, int port);

Membuat sebuah stream socket dan juga koneksi ke suatu port tertentu pada sebuah

komputer berdasar namanya.

 

Socket(InetAddress address, int port, InetAddress

localAddr, int localPort);

Socket(String host, int port, InetAddress localAddr, int

localPort);

Membuat sebuah socket dan mengkoneksikannya ke port yang dituju pada alamat IP yang disebutkan pada parameter address atau nama host. Selain itu juga akan dilakukan bind socket ke alamat lokal dan port lokal. (Hal ini dilakukan jika koneksi antara client dan server membutuhkan nomor port yang sudah ditentukan.

 

getInetAddress();

Untuk mendapatkan nama host yang dituju dan alamat Ipnya

 

getPort();

Untuk mendapatkan nomor remote host

 

getLocalPort();

Untuk mendapatkan nomor port localhost

 

getLocalAddress();

Untuk mendapatkan alamat local dimana socket digunakan

 

getInputStream();

Mengembalikan objek input stream dari socket

 

getOutputStream();

Mengembalikan objek output stream ke socket

 

setSoTimeout(int timeout);

getSoTimeOut();

Kedua method tersebut digunakan untuk memberi (set) dan mengambil (get) nilai opsi Socket untuk time out block (dalam milidetik) reading dari socket (SO_TIMEOUT). Jika dalam waktu timeout tidak mendapat suatu nilai maka, akan dilemparkan ke exception java.net.SocketTimeoutException. Nilai default timeoutnya adalah 0, yang berarti tanpa batas.

 

setTCPNoDelay(boolean on);

getTCPNoDelay();

Kedua method ini digunakan untuk memberi dan mengambil nilai opsi Socket TCP_NODELAY, yaitu untuk mengaktifkan atau menonaktifkan Algoritma Nagle (RFC 896), yaitu algoritma yang membuat TCP lebih efisien dalam konsumsi bandwidth dengan cara memperlambat penulisan data dalam ukuran yang kecil sehingga data-data yang ada dapat terkirimkan dalam suatu paket dengan ukuran besar. Nilai default opsi ini adalah aktif. Namun jika diinginkan adanya pengurangan network latency (waktu delay dalam pengiriman paket) dan meningkatkan unjuk kerja, maka opsi ini harus di nonaktifkan (di set dengan nilai false), namun akibatnya konsumsi bandwidth akan bertambah besar.

 

setSoLinger(boolean on, int linger);

getSoLinger();

Method tersebut akan mengaktifkan (true) atau menonaktifkan (false) opsi SO_LINGER dengan nilai waktu linger dalam milidetik. Opsi ini berpengaruh ketika socket ditutup, yaitu menentukan nilai waktu maksikum koneksi yang masih akan dipertahankan sampai socket koneksi benar-bernar ditutup. Hal ini berguna untuk mengirim dan memberikan ACK (acknowledge) terhadap data yang belum terkirim.

 

setSendBufferSize(int size);

getSendBufferSize();

Method ini akan mengatur dan mengambil informasi tentang ukuran buffer SO_SNDBUF, yaitu buffer untuk mengiriman. Ukuran ini juga harus disesuaikan ukuran buffer pada level network.

 

setReceiveBufferSize(int size);

getReceiveBufferSize();

Method ini digunakan jika Anda ingin mengatur ukuran buffer SO_RCVBUF, yaitu buffer yang digunakan untuk menampung paket yang masuk. Ukuran buffer ini juga digunakan untuk mengatur ukuran window yang diterapkan oleh TCP untuk flow controlnya (sliding window). Dalam pemanfaatan opsi ini, perlu dipastikan antara RCVBUF client dengan server ada sinkronisasi, sehingga sebelum server membind port yang akan digunakan ke socket (TCP) ataupun sebelum client membuka koneksi ke server, terlebih dahulu opsi ini harus di atur, jika Anda ingin mengaturnya.

 

Kelas java.net.ServerSocket

Kelas ini berfungsi untuk listen koneksi yang sudah terjadi dan siap menerima permintaan dari proses lain. Kelas ini digunakan ketika pembuatan aplikasi server yang

bersifat Connection Oriented Ketika dibuat obyek baru ServerSocket, untuk dapat menerima dan mengirim melalui stream perlu dibuat InputStream dan OutputStream. ServerSocket siap menerima permintaan client ketika menjalankan method accept() dan akan mengakhiri koneksi ketika menjalankan method close()

 

ServerSocket( int port [, int backlog [, InetAddress bindAddress ]] )

Membuat sebuah server dengan port tertentu, batasan jumlah antrian (backlog), dan

alamat IP bindAddress.

 

 

 

Kelas java.net.Datagram

Digunakan untuk membangun koneksi connectionless dengan protokol UDP.

 

Terdapat 2 kelas pendukung:

– Kelas java.net.DatagramPacket

Merupakan kelas yang menyatakan atau mewakili sebuah paket informasi, yaitu

sebuah array byte yang dipertukarkan pada jaringan.

Constructor:

DatagramPacket(byte[] buf, int length)

Kelas ini dapat digunakan untuk mengambil informasi. Constructor ini

membutuhkan sebuah array byte yang menjadi parameter pertama, yang

berfungsi untuk menyimpan data dan informasi ukuran data yang diterima.

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

Constructor ini digunakan untuk membuat paket Datagram yang akan mengirim data. Constructor ini memerlukan informasi array byte yang akan dikirim dan panjangnya, serta alamat dan port yang dituju.

Method:

Memiliki 4 method penting :

getData() untuk mengambil informasi data

getLength() untuk mengambil panjang datagram

getAddress() untuk mengambil alamat IP

getPort() untuk mengambil alamat port

 

– Kelas java.net.DatagramSocket

Kelas ini mengirim dan menerima DatagramPacket dari atau ke jaringan.

Constructor:

DatagramSocket(int port)

Kelas ini dapat digunakan untuk menyatakan penggunaan suatu nomor port sebagai “pintu” untuk menerima koneksi dari client.

DatagramSocket(int port, InetAddress laddr)

Kelas ini membentuk koneksi dengan protokol UDP pada alamat IP lokal tertentu dan pada nomor port tertentu.

DatagramSocket()

Kelas ini membentuk koneksi dengan protokol UDP pada alamat IP lokal host dengan penentuan nomor portnya secara random berdasar tersedianya nomor port yang dapat digunakan.

Method:

Ø send(DatagramPacket data) akan mengirim DatagramPacket ke host dan port yang dituju

Ø receive(DatagramPacket data) akan memblok eksekusi sampai suatu paket lengkap diterima

Exception

Kelas-kelas Exception yang dibangkitkan untuk pemrograman socket, ketika ada kesalahan :

1. SocketException

Kelas ini merupakan kelas yang diturunkan dari kelas IOException. Kelas exception ini dipanggil atau dipicu ketika ada kegagalan dalam pemakaian socket, sebagai contoh adalah kegagalan dalam protokol TCP. Salah satu penyebabnya yang mungkin terjadi adalah ketika port yang akan digunakan sudah digunakan sebelumnya pada localhost. Penyebab yang lain adalah user tidak dapat melakukan bind ke port yang dituju. Misalnya saja, Anda ingin menggunakan port 80 untuk aplikasi Anda, namun ternyata pada komputer Anda tersebut sudah berjalan HTTP Server yang juga menggunakan port 80. Bila hal ini terjadi, maka JVM akan melemparkan kegagalan yang ada ke kelas exception SocketException.

2. BindException Exception

Kelas ini akan dipanggil ketika ada port lokal yang akan digunakan sudah terpakai oleh yang lain, atau ada kegagalan dalam permintaan untuk menggunakan alamat.

3. ConnectException Exception

Kelas ini akan dipanggil ketika sebuah koneksi ditolak oleh host yang dituju, oleh karena tidak ada proses yang siap menerima data pada port yang dituju.

4. NoRouteToHostException

Koneksi yang akan dibangun tidak dapat dipenuhi oleh karena melebihi waktu timeout yang tersedia atau host yang dituju tidak dapat dicapai (unreachable).

 

Informasi Antar Muka Jaringan

Untuk mendapatkan informasi network interface pada Java telah terdapat kelas NetworkInterface yang mampu mendapatkan informasi tentang antar muka jaringan, nama device, dan IP yang ter-bind. Nama device misalnya eth0, lp0, ppp0 dan lain-lain.

Contoh dari javasoft.com

import java.io.*;

import java.net.*;

import java.util.*;

public class DisplayNet {

public static void main(String argv[])

throws Exception

{

//panggil method getNetworkInterfaces()

//untuk mendapatkan semua antarmuka jaringan

//yang digunakan di komputer lokal

Enumeration e =

NetworkInterface.getNetworkInterfaces();

//perulangan untuk mengambil tiap antarmuka jaringan

//hasil dari method getNetworkInterfaces()

while(e.hasMoreElements()) {

NetworkInterface netface = (NetworkInterface)

e.nextElement();

System.out.println(“Net interface: “+

netface.getName());

//ambil semua informasi alamat IP dari

//tiap antarmuka jaringan

Enumeration e2 = netface.getInetAddresses();

//lakukan perulangan untuk tiap alamat IP

//yang didapat pada tiap antarmuka jaringannya

while(e2.hasMoreElements()) {

InetAddress ip = (InetAddress) e2.nextElement();

System.out.println(“IP address: “+

ip.toString());

}

}

}

}

 

Contoh program aplikasi HTTP Client yang akan menggunakan perintah HTTP untuk mengambil dokumen yang ada melalui protokol HTTP

import java.io.*;

import java.net.*;

/**

* Contoh aplikasi yang membuka koneksi ke web server

* local dan membaca sebuah dokumen darinya

*/

public class ExHTTPClient {

public static void main(String args[])

{

try

{

// Buka koneksi client dengan socket

Socket clientSocket = new Socket(args[0], 80);

System.out.println(“Client: ” + clientSocket);

// Panggil method untuk mengambil dokumen

getHTML(clientSocket, args[1]);

}

catch (UnknownHostException e)

{ System.out.println(e); }

catch (IOException e)

{ System.err.println(e); }

}

/**

* Method yang akan meminta sebuah dokumen ke web server.

* Tampilkan hasil reply dari server dan tutup

* koneksinya.

*/

public static void getHTML(Socket clientSocket,

String fileName)

{

try

{

// membentuk input dan output stream dari

// socket yang terbentuk untuk pengiriman

// dan penerimaan data

DataOutputStream outbound = new DataOutputStream(

clientSocket.getOutputStream() );

DataInputStream inbound = new DataInputStream(

clientSocket.getInputStream() );

// kirim sebuah permintaan HTTP ke server

outbound.writeBytes(“GET ” + fileName +

” HTTP/1.0\r\n\r\n”);

// membaca respone dari HTTP

String responseLine;

while ((responseLine = inbound.readLine())

!= null)

{

// tampilkan setiap baris ke layar monitor

System.out.println(responseLine);

}

// Clean up

outbound.close();

inbound.close();

clientSocket.close();

}

catch (IOException e)

{ System.out.println(e); }

}

}

 

Contoh output:

Client:

Socket[addr=localhost/127.0.0.1,port=80,localport=1072]

HTTP/1.1 200 OK

Date: Tue, 20 Sep 2005 02:15:38 GMT

Server: Apache/1.3.23 (Win32)

Last-Modified: Tue, 05 Aug 2003 17:00:00 GMT

ETag: “0-74d-3f2fe290″

Accept-Ranges: bytes

Content-Length: 1869

Connection: close

Content-Type: text/html

<html> ….. dan seterusnya

Dari program diatas kita sudah dapat mengambil dokumen HTML seperti halnya pada telnet. Kelas Socket yang kita buat menggunakan konstruktor new Socket(host,port).

Karena program ini bersifat Connection Oriented maka kita menggunakan kelas DataOutputStream untuk menulis data ke socket dan DataInputStream untuk membaca data dari socket.

Pada contoh diatas kita menggunakan methode GET, bagaimana untuk metode POSTnya?

 

Contoh aplikasi Server dan client

CLIENT

import java.net.*;

import java.io.*;

import java.util.*;

public class InfoClient {

private final int INFO_PORT=50000;

private final String TargetHost = “localhost”;

private final String QUIT = “QUIT”;

/** Creates a new instance of InfoClient */

public InfoClient() {

try {

/* siapkan input stream dari standard input (keyboard) */

BufferedReader inFromUser =

new BufferedReader(new

InputStreamReader(System.in));

/* buat koneksi socket ke server dan port yang dituju */

Socket clientSocket = new

Socket(TargetHost, INFO_PORT);

/* siapkan output stream ke socket */

DataOutputStream outToServer =

new DataOutputStream(

clientSocket.getOutputStream());

/* siapkan input stream dari socket */

BufferedReader inFromServer =

new BufferedReader(

new InputStreamReader(

clientSocket.getInputStream()));

/* tampilkan informasi Welcome dari Server

* oleh karena method readLine() akan

* membaca satu baris string

* yang diakhir dengan karakter ENTER,

* maka perlu diberikan 3

* pemanggilan method readLine()

* untuk membaca 3 baris pesan Welcome

* yang dikirim dari server

*/

System.out.println(inFromServer.readLine());

System.out.println(inFromServer.readLine());

System.out.println(inFromServer.readLine());

System.out.println(“”);

boolean isQuit = false;

while (!isQuit) {

/* menunggu masukan perintah dari User */

System.out.print(“Perintah Anda : “);

String cmd = inFromUser.readLine();

/* konversi ke Upper dan cek

* apakah perintah QUIT yang diketikkan

* jika QUIT, beri nilai true untuk isQUIT

* agar looping !isQUIT selesai

*/

cmd = cmd.toUpperCase();

if (cmd.equals(QUIT)) {

isQuit = true;

}

/* kirim perintah yang dimasukkan ke server

* dan diakhiri dengan karakter ENTER, karena

* pada server data dari client dibaca

* dengan method readLine() untuk membaca

* satu baris string sampai dengan ENTER

*/

outToServer.writeBytes(cmd + “\n”);

/* block reading ….

* client harus menunggu balasan dari server

*/

String result = inFromServer.readLine();

System.out.println(“Dari Server: ” + result);

}

/* tutup semua stream dan koneksi socket */

outToServer.close();

inFromServer.close();

clientSocket.close();

}

catch (IOException ioe) {

System.out.println(“Error:” + ioe);

}

catch (Exception e) {

System.out.println(“Error:” + e);

}

}

/**

* Program Utama InfoClient

*/

public static void main(String[] args) {

new InfoClient();

}

}

 

SERVER

import java.io.*;

import java.net.*;

import java.util.*;

public class InfoServer {

private final int INFO_PORT=50000;

private String datafromClient;

/** InfoServer Constructor */

public InfoServer() {

BufferedReader inFromClient;

DataOutputStream outToClient;

Socket serverSocket;

try {

/* bind port 50000 ke alamat lokal */

ServerSocket infoServer =

new ServerSocket(INFO_PORT);

System.out.println(“Server telah siap…”);

/* lakukan perulangan tanpa henti,

* sampai client memberikan perintah QUIT

*/

while (true) {

/* masuk ke mode listening,

* server siap menerima permintaan dari client

*/

serverSocket = infoServer.accept();

System.out.println(“Ada client ” +

“yang terkoneksi!”);

/* buat input stream dari socket

* dan juga sekaligus konversi dari

* byte stream ke character stream

* (InputStreamReader)

* BufferedReader akan memudahkan

* dalam pengolahan data karakter

*/

inFromClient =

new BufferedReader(

new InputStreamReader(

serverSocket.getInputStream()));

/* buat output stream ke socket */

outToClient =

new DataOutputStream(

serverSocket.getOutputStream());

/* tulis welcome ke client */

outToClient.writeBytes(“InfoServer versi 0.1\n”+

“hanya untuk testing..\n”+

“Silahkan berikan perintah TIME | NET | QUIT\n”);

/* lakukan perulangan sampai client

* mengirimkan perintah QUIT

*/

boolean isQUIT = false;

while (!isQUIT) {

/* baca data dari client */

datafromClient = inFromClient.readLine();

if (datafromClient.startsWith(“TIME”)) {

outToClient.writeBytes(new

Date().toString() + “\n”);

} else if (datafromClient.startsWith(“NET”)) {

outToClient.writeBytes(

InetAddress.getByName(“localhost”).toString() +

“\n”);

} else if (datafromClient.startsWith(“QUIT”))

{

isQUIT = true;

}

}

outToClient.close();

inFromClient.close();

serverSocket.close();

System.out.println(“Koneksi client tertutup..”);

}

}

catch (IOException ioe) {

System.out.print(“error: ” + ioe);

}

catch (Exception e) {

System.out.print(“error: ” + e);

}

}

/* program utama */

public static void main(String[] args) {

new InfoServer();

}

}

 

sumber: http://oop08.wordpress.com/category/pemrogrman-jaringan-java-socket/

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s