Socket Programming - 1 (TCP) As’ad Djamalilleil http://kampusku.my.id asad.kom@gmail.com
Contoh Komunikasi Jaringan Server [192.168.10.1] Program Server Program Client 1 Client [192.168.10.2] Program Client 2 Program Client 3
Komunikasi jaringan memiliki 2 endpoint atau titik komunikasi Setiap komputer memiliki 65535 buah nomor port Program komputer yang ingin dikomunikasikan lewat jaringan komputer harus terhubung ke salah satu nomor port Nomor port yang digunakan harus “diikat” ke sebuah socket Apabila ada data yang diterima, maka sistem operasi dapat memberikan data tersebut ke program yang tepat sesuai dengan socket yang digunakan
Socket Socket adalah satu endpoint dari hubungan komunikasi dua arah antara dua program yang berjalan di jaringan Socket terikat pada sebuah nomor port sehingga layer TCP dapat mengenali aplikasi mana yang dikirimi data Endpoint adalah sebuah kombinasi dari alamat IP dan nomor port Setiap koneksi TCP dapat secara unik dikenali dari dua endpoint-nya Dengan demikian kita dapat memiliki banyak koneksi antara host dan server
Pada umumnya, setiap server memiliki socket yang terikat dengan nomor port tertentu Server menunggu sambil mendengarkan/listening lewat socket terhadap permintaan/request dari client untuk terhubung
Client mengetahui nama host dari komputer server dan nomor port yang digunakan server untuk listening Untuk meminta koneksi ke server, client mencoba untuk “bertemu” dengan server pada komputer dan port dari server Client juga perlu untuk mengenalkan dirinya kepada server sehingga dapat terhubung dengan nomor port yang akan digunakan saat terhubung
Pada saat server menerima permintaan client untuk terhubung, server mendapatkan sebuah socket baru yang terikat dengan port lokal yang sama dan juga memiliki remote endpoint yang menyimpan alamat dan port dari client Server membuat socket baru agar tetap dapat mendengarkan permintaan dari socket awal, sementara melayani client yang telah terkoneksi
Apabila terkoneksi, sebuah socket juga akan dibuat di client, dan dapat digunakan untuk berkomunikasi dengan server Pada akhirnya, server dan client dapat berkomunikasi lewat socket-nya masing-masing
Paket java.net Paket java.net mendukung dua macam protokol jaringan yang umum: TCP (Transmission Control Protocol), digunakan untuk komunikasi antar dua aplikasi. TCP biasanya digunakan pada protokol TCP/IP UDP (User Datagram Protocol), protokol connection-less yang memungkinkan paket data dikirimkan antar aplikasi
Di dalam paket java.net memiliki class Socket dan ServerSocket Class Socket merupakan implementasi satu sisi dari koneksi dua arah antara program Java kita dengan program lain pada jaringan Class ServerSocket merupakan implementasi sebuah socket dimana server-server dapat gunakan untuk mendengarkan dan menerima koneksi ke client-client
Method Class ServerSocket Keterangan public ServerSocket(int port) throws IOException Mencoba untuk membuat socket server yang terikat dengan port tertentu. Exception terjadi jika port tersebut telah digunakan oleh aplikasi lain public ServerSocket(int port, int backlog) throws IOException Mirip dengan konstruktor di atas, parameter backlog menentukan seberapa banyak client yang disimpan pada daftar tunggu public ServerSocket(int port, int backlog, InetAddress address) throws IOException Mirip dengan konstruktor di atas, parameter InetAddress menentukan alamat IP lokal untuk diikat. InetAddress digunakan untuk server yang dapat memiliki beberapa alamat IP, memungkinkan server untuk menentukan alamat IP mana yang bertugas menerima request dari client public ServerSocket() throws IOException Membuat socket server yang tidak terikat. Bila menggunakan konstruktor ini, gunakan method bind() untuk mengikat socket server
Method Keterangan public int getLocalPort() Memberikan nomor port yang socket server gunakan untuk mendengar. Method ini berguna jika nilai 0 digunakan untuk nomor port pada konstruktor dan membiarkan server yang mencari port public Socket accept() throws IOException Menunggu permintaan client. Method ini terblok sampai ada client yang terhubung ke server pada port yang sesuai atau socket kehabisan waktu (time out), dengan asumsi nilai time-out telah ditentukan menggunakan method setSoTimeOut(). Bila tidak maka method ini terblok terus menerus public void setSoTimeout(int timeout) Menentukan nilai time-out untuk berapa lama socket server menunggu client setelah method accept() dipanggil public void bind(SocketAddress host, int backlog) Mengikat socket ke server dan port tertentu pada objek SocketAddress. Gunakan method ini jika objek ServerSocket dibuat menggunakan konstruktor tanpa argumen
Method Class Socket Method Keterangan public Socket(String host, int port) throws UnknownHostException, IOException Method ini mencoba untuk terhubung ke server tertentu pada port tertentu. Jika konstruktor tidak memberikan exception, koneksi sukses dan client terhubung ke server public Socket(InetAddress host, int port) throws IOException Method ini identik dengan konstruktor sebelumnya, kecuali host ditunjuk oleh sebuah objek InetAddress public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. Terhubung ke host dan port tertentu, membuat sebuah socket pada host lokal pada alamat dan port tertentu public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. Method ini identik dengan konstuktor sebelumnya, kecuali host ditunjuk oleh sebuah objek InetAddress, bukan String public Socket() Membuat sebuah socket yang tidak terhubung. Gunakan method connect() untuk menghubungkan socket ini ke sebuah server
Method Keterangan public void connect(SocketAddress host, int timeout) throws IOException Method ini menghubungkan socket ke host tertentu. Method ini dibutuhkan hanya jika objek Socket dibuat lewat konstruktor tanpa argumen public InetAddress getInetAddress() Method ini memberikan alamat dari komputer lain yang terhubung dengan socket ini public int getPort() Memberikan nomor port yang terhubung dengan socket dari komputer remote public int getLocalPort() Memberikan nomor port yang terhubung dengan socket pada komputer lokal public SocketAddress getRemoteSocketAddress() Memberikan alamat dari socket remote
Method Keterangan public InputStream getInputStream() throws IOException Memberikan aliran input dari socket. Aliran input terhubung ke aliran output dari socket remote public OutputStream getOutputStream() throws IOException Memberikan aliran input dari socket. Aliran output terhubung ke aliran input dari socket remote public void close() throws IOException Menutup socket, menjadikan objek socket ini tidak lagi dapat dihubungkan ke server manapun
Method Class InetAddress Keterangan static InetAddress getByAddress(byte[] addr) Memberikan sebuah objek InetAddress berdasarkan alamat IP mentah static InetAddress getByAddress(String host, byte[] addr) Membuat sebuah InetAddress berdasarkan pada nama host dan alamat IP yang diberikan static InetAddress getByName(String host) Menentukan alamat IP dari host, berdasarkan nama host String getHostAddress() Memberikan alamat IP berupa string String getHostName() Memberikan nama host dari alamat IP ini static InetAddress InetAddress getLocalHost() Memberikan nama host lokal String toString() Mengubah alamat IP ke string
Contoh aplikasi client import java.net.*; import java.io.*; public class TCPClient { public static void main (String args[]) { //arguments supply message and hostname of destination Socket s = null; try{ int serverPort = 7896; s = new Socket(args[1], serverPort); DataInputStream in = new DataInputStream(s.getInputStream()); DataOutputStream out = new DataOutputStream(s.getOutputStream()); out.writeUTF(args[0]); // UTF is a string encoding String data = in.readUTF(); System.out.println("Received: " + data); }
catch (UnknownHostException e){ System.out.println("Sock:" + e.getMessage()); } catch (EOFException e){ System.out.println("EOF:" + e.getMessage()); catch (IOException e){ System.out.println("IO:" + e.getMessage()); finally { if(s!=null) try { s.close(); /*close failed*/
Contoh aplikasi server import java.net.*; import java.io.*; public class TCPServer { public static void main (String args[]) { try{ int serverPort = 7896; ServerSocket listenSocket = new ServerSocket(serverPort); while(true) { Socket clientSocket = listenSocket.accept(); Connection c = new Connection(clientSocket); } catch(IOException e){ System.out.println("Listen :"+e.getMessage());
class Connection extends Thread { DataInputStream in; DataOutputStream out; Socket clientSocket; public Connection(Socket aClientSocket) { try { clientSocket = aClientSocket; in = new DataInputStream(clientSocket.getInputStream()); out =new DataOutputStream(clientSocket.getOutputStream()); this.start(); } catch(IOException e){ System.out.println("Connection:" + e.getMessage());
public void run(){ try { // an echo server String data = in.readUTF(); System.out.println(data); out.writeUTF(data); } catch(EOFException e){ System.out.println("EOF:" + e.getMessage()); catch(IOException e){ System.out.println("IO:" + e.getMessage()); finally { try { clientSocket.close(); catch (IOException e){ /*close failed*/