Sistem Terdistribusi 4
Pemrograman Socket
Pemrograman Socket
Socket
Socket
• Socket adalah sebuah
abstraksi perangkat lunak yang digunakan sebagai
Process A
Process B
yang digunakan sebagai suatu "terminal" dari
suatu hubungan antara g dua mesin atau proses yang saling b i k k i berinterkoneksi. • End to end i ti communication
a socket
Addresses Ports and Sockets
Addresses, Ports and Sockets
Lik
t
t
d
ilb
• Like apartments and mailboxes
– Apartement is the applicationY t t b ildi dd i th dd
– Your apartment building address is the address – Your mailbox is the port
The post office system is the network – The post-office system is the network
– The socket is the key that gives you access to the
right mailbox right mailbox
• Q: How do you choose which port a socket
Q: How do you choose which port a socket
connects to?
Socket types
Socket types
St
k t
• Stream socket
– Paket-paket data byte, bidirectional connection – Ordered reliable delivering of packets
– Ordered, reliable delivering of packets – Use TCP
• Datagram socket
Datagram socket
– There is no connection.
• Each packet is sent independently from the others
U d d li bl d li i f k t
– Unordered, unreliable delivering of packets – Use UDP
• Raw sockets
• Raw sockets
Stream vs Datagram
Stream vs Datagram
App socket 3 2 1 Dest.Datagram
App D1Stream
socket 3 2 1 D2 D3Operasi Socket
Operasi Socket
S
k t d
t
l k k
i
• Socket dapat melakukan operasi:
– Koneksi ke mesin remote (connect)M i i d t ( d)
– Mengirim data (send) – Menerima data (receive)
Mentutup koneksi (close) – Mentutup koneksi (close)
– Bind to a port (bind), khusus server
• Di tiap mesin yang saling berinterkoneksi harus
• Di tiap mesin yang saling berinterkoneksi, harus
terpasang socket.
– Dalam arti saling tahu sama tahu – Dalam arti saling tahu sama tahu – Sesuai kesepakatan
Stream Socket lifetime
Stream Socket lifetime
• Creation
• Binding
– Assigning a name to the socket – until a name isAssigning a name to the socket until a name is
assigned, no messages may be received. – Communicating processes are bound by an
i ti hi h i I t t i d f l l
association, which in Internet is composed of local
and foreign addresses, and local and foreign ports.
ports.
– The bind() system call specifies half of an association {local address, local port},
– while the connect and accept primitives complete the association {foreign address, foreign port}.
Stream Socket lifetime (cont )
Stream Socket lifetime (cont.)
C i
• Connection
– Connection establishment, between a server and a client
– The server binds a socket to a well known address and passively p y
listens, which means that he waits for a client to connect
– When a client connects, the server accepts the connection.
• Data transfer • Data transfer
– When the two process are connected, data flow may begin between them (in byte data)
• Discard
– When the communication ends, the sockets must be closed, to enable
the system to release resources, especially the bounded names (e.g. y p y ( g local ports) because they cannot be reused until they are available from any possible association.
Data transfer
Data transfer
• Heterogenity
• Big Endian vs Little Endian
Big Endian vs Little Endian
• Solution:
– Marshalling
– Unmarshalling
g
Big Endian Big-Endian machine Little-Endian machine 128.119.40.12 12.40.119.128 128 119 40 12 128 119 40 12Marshalling / Unmarshalling
Marshalling / Unmarshalling
• Object Serialization
Big-Endian Littl E di 128.119.40.12 128.119.40.12 g machine Little-Endian machine un m sh a g 128 119 40 12 12 40 119 128 128 119 40 12 128 119 40 12 m ar a llinSerializable
Serializable
• Pada pemrograman socket biasanya yang dikirim adalah
d t t
data stream.
– Nah, bagaimana jika yang dikirim adalah suatu obyek?
• Hal ini dapat dilakukan dengan menggunakan serialisasiHal ini dapat dilakukan dengan menggunakan serialisasi obyek.
• Object Serialization adalah teknik dimana suatu program dapat menyimpan status obyek ke dalam sebuah file
dapat menyimpan status obyek ke dalam sebuah file dan kemudian dapat dipanggil kembali dari file ke memori atau dikirim melalui jaringan.
S i li i tik b k b k d t i k – Serialisasi memastikan agar obyek-obyek dapat sinkron
• Jika sebuah obyek ingin diserialisasi, maka obyek itu harus mengimplementasikan java.io.Serializable. g p j
• Untuk menuliskan obyek yang terserialisasi ke file dibutuhkan I/O stream khusus, yaitu menggunakan
ObjectOutputStream yang merupakan subclass dari ObjectOutputStream yang merupakan subclass dari FilterOutputStream.
Contoh Pegawai
Contoh Pegawai
Contoh SimpanPegawai
Contoh SimpanPegawai
Penjelasan
Penjelasan
B
ti
Si
P
i k
• Berarti program SimpanPegawai akan
menyimpan 2 obyek pegawai yaitu “aaa” dan
“bbb” ke dalam file bernama “db”
bbb ke dalam file bernama db .
• Sedangkan untuk pembacaan file yang berisi
obyek juga harus dilakukan secara berurutan
obyek juga harus dilakukan secara berurutan,
yaitu “aaa” dulu baru “bbb”.
• Karena pembacaan dengan menggunakan
• Karena pembacaan dengan menggunakan
readObject() yang mengembalikan Object,
maka harus dilakukan casting sesuai dengan
maka harus dilakukan casting sesuai dengan
tipe Objectnya.
Contoh: BacaPegawai
Contoh: BacaPegawai
Serialisasi dgn Vector
Serialisasi dgn Vector
Transient
Transient
D l
t h
t h di t
t ib t d i
• Dalam contoh-contoh diatas, semua atribut dari
kelas Pegawai secara otomatis bisa dibaca
karena bersifat serializable
karena bersifat serializable.
• Kita bisa membatasi hak akses terhadap atribut
tertentu saja yang bersifat serializable
tertentu saja yang bersifat serializable.
• Hal ini dapat dilakukan dengan menggunakan
keyword transient
keyword transient.
• Dengan keyword itu maka atribut tersebut tidak
ikut “terbawa” untuk dikirimkan dalam deretan
ikut terbawa untuk dikirimkan dalam deretan
byte melalui I/O Stream.
Pegawai yang Transient
Pegawai yang Transient
Stream sockets:
Java Example
• package java.net
• Classes:
Classes:
– InetAddress
S
k t
– Socket
– ServerSocket
– DatagramSocket
InetAddress class
InetAddress class
• Kelas ini digunakan untuk mengambil informasi
g
g
IP suatu komputer.
– Kelas ini bersifat static dan tidak memiliki konstruktor
konstruktor.
• Method-methodnya adalah:
getByName(namahost) yang akan menerima
– getByName(namahost) yang akan menerima
sebuah string nama host dan mengembalikan alamat IP berdasarkan DNS, berupa object InetAddress.
U t k ilk k th d t St i () • Untuk menampilkannya: gunakan method toString()
– getLocalHost() yang akan mengembalikan alamat IP dan nama host pada komputer lokal.
– getAllByName(namahost) mengembalikan array InetAddress
• Kemungkinan error: UnknownHostException
• Kemungkinan error: UnknownHostException
Contoh getByName
Contoh getByName
Class ServerSocket
Class ServerSocket
C
t
t
• Constructor
– ServerSocket(int port)
S
S k t(i t
t i t b kl )
– ServerSocket(int port, int backlog)
– ServerSocket(int port, int backlog,
InetAddress bindAddr)
InetAddress bindAddr)
• Methods
Socket accept()
– Socket accept()
– void close()
InetAddress getInetAddress()
– InetAddress getInetAddress()
– int getLocalPort()
Class Socket
Class Socket
• Constructor
– Socket (InetAddress address, int port) – Socket (String host, int port)
• Methods
– InputStream getInputStream()
– OutputStream getOutputStream()p g p () – void close()
– InetAddress getInetAddress()InetAddress getInetAddress() – int getLocalPort()
Prinsip ServerSocket
Prinsip ServerSocket
C t S S k t bj t • Create a ServerSocket object.
– ServerSocket servSock = new ServerSocket(1234);
• Put the server into a waiting state • Put the server into a waiting state.
– Socket link = servSock.accept();
• Set up input and output streams.p p p
– Scanner input = new Scanner(link.getInputStream());
– PrintWriter output = new PrintWriter(link.getOutputStream(),true);
S d d i d t • Send and receive data.
output.println("Awaiting data..."); String input = input.nextLine(); g p p ();
• Close the connection (after completion of the dialogue).
Prinsip Socket (client)
Prinsip Socket (client)
Establish a connection to the server • Establish a connection to the server.
– the server's IP address (of type InetAddress); – the appropriate port number for the service.
Socket link = new Socket(InetAddress.getLocalHost(),1234);
• Set up input and output streams.
– Scanner input = new Scanner(link getInputStream());Scanner input new Scanner(link.getInputStream());
– PrintWriter output = new PrintWriter(link.getOutputStream(),true);
• Send and receive data.
Th S bj t t th li t ill i t b – The Scanner object at the client will receive messages sent by
the PrintWriter object at the server,
– while the PrintWriter object at the client will send messages that are received by the Scanner object at the server (using methods are received by the Scanner object at the server (using methods nextLine and println respectively).
Contoh InfoClient dan InfoServer
Contoh InfoClient dan InfoServer
• InfoClient.java
• InfoServer java
InfoServer.java
Kita Lanjutkan dengan Socket UDP!
Bagaimana jika client yang dilayani lebih dari satu? Bagaimana jika client yang dilayani lebih dari satu? - MULTI THREADING
Kelas java net DatagramSocket
Kelas java.net.DatagramSocket
Kelas ini mengirim dan menerima DatagramPacket dari • Kelas ini mengirim dan menerima DatagramPacket dari
atau ke jaringan. Constructor:
• DatagramSocket(int port)
K l i i d t di k t k t k t
– Kelas ini dapat digunakan untuk menyatakan penggunaan suatu nomor port sebagai "pintu" untuk menerima koneksi dari client.
• DatagramSocket(int port, InetAddress addr)
– Kelas ini membentuk koneksi dengan protokol UDP pada alamat IP lokal tertentu dan pada nomor port tertentu.
• DatagramSocket() g ()
– 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.
Methods DatagramSocket
Methods DatagramSocket
• send(DatagramPacket data), akan
mengirim DatagramPacket ke host dan
g
g
port yang dituju
• receive(DatagramPacket data) akan
• receive(DatagramPacket data), akan
memblok eksekusi sampai suatu paket
lengkap diterima
Kelas java net DatagramPacket
Kelas java.net.DatagramPacket
Merupakan kelas yang menyatakan atau mewakili • Merupakan kelas yang menyatakan atau mewakili
sebuah paket informasi, yaitu sebuah array byte yang dipertukarkan pada jaringan.
Constructor:
• DatagramPacket(byte[] buf int length) • 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 parameter pertama, yang berfungsi untuk menyimpan data dan informasi ukuran data yang diterima.
• DatagramPacket(byte[] buf, int length, InetAddress address int port)
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 byte yang akan dikirim dan panjangnya, serta alamat dan port yang dituju.
Methods DatagramPacket
Methods DatagramPacket
tD t ()
t k
bil i f
i
• getData(), untuk mengambil informasi
data, kembaliannya berupa byte[] akan
mempersulit kita membaca data, sehingga
kita bisa mengubahnya menjadi String
atau ByteArrayInputStream
• getLength(), untuk mengambil panjang
get e gt (), u tu
e ga b pa ja g
datagram
• getAddress() untuk mengambil alamat IP
• getAddress(), untuk mengambil alamat IP
• getPort(), untuk mengambil alamat port
Exception
Exception
• public class SocketException extends
IOException
p
– Kelas ini merupakan kelas yang diturunkan
dari kelas IOException Kelas exception ini
dari kelas IOException. Kelas exception ini
dipanggil atau dipicu ketika ada kegagalan
dalam pemakaian socket
dalam pemakaian socket
– contoh: kegagalan dalam protokol TCP.
ketika port yang akan digunakan sudah digunakan • ketika port yang akan digunakan sudah digunakan
Exception (2)
Exception (2)
bli
l
Bi dE
ti
t
d
• public class BindException extends
SocketException
K l i i k di il k tik d t l k l
– Kelas ini akan dipanggil ketika ada port lokal yang akan digunakan sudah terpakai oleh yang lain, atau ada kegagalan dalam permintaan untuk g g p
menggunakan alamat.
• public class ConnectException extends
SocketException
– Kelas ini akan dipanggil ketika sebuah koneksi ditolak
l h h t dit j l h k tid k d
oleh host yang dituju, oleh karena tidak ada proses yang siap menerima data pada port yang dituju.
Exception (3)
Exception (3)
bli
l
N R
t T H
tE
ti
• public class NoRouteToHostException
extends SocketException
– Koneksi yang akan dibangun tidak dapat
dipenuhi oleh karena melebihi waktu timeout
di
h
di j
id k
yang tersedia atau host yang dituju tidak
dapat dicapai (unreachable).
• public class ProtocolException extends
IOException
– Terjadi ketika data diterima dari network
menyalahi aturan TCP/IP
Datagram Sockets
Datagram Sockets
SERVER:
1. Create a DatagramSocket object
DatagramSocket dgramSocket =
new DatagramSocket(1234); new DatagramSocket(1234);
2. Create a buffer for incoming datagrams
byte[] buffer = new byte[256];
3. Create a DatagramPacket object for the incoming datagram:
t t t 2 t th i l t d b t th
• constructor get 2 arguments: the previously-created byte array; the size of this array.
DatagramPacket inPacket = new DatagramPacket inPacket new
DatagramPacket(buffer, buffer.length);
4. Accept an incoming datagram
Datagram Sockets
Datagram Sockets
SERVER:5 Accept the sender’s address and port from the packet 5. Accept the sender s address and port from the packet
InetAddress clientAddress = inPacket.getAddress(); int clientPort = inPacket.getPort();
6 Retrieve the data from the buffer: 3 arguments: byte array start byte 6. Retrieve the data from the buffer: 3 arguments: byte array, start byte
array position, and length of byte array
string message = new String(inPacket.getData(), 0, inPacket.getLength());
7. Create the response datagram. 3 arguments:
the byte array containing the response message; the size of the response; the client's address; the client's port numberp ; ; p
.
DatagramPacket outPacket = new
DatagramPacket(response.getBytes(),
response.length(),clientAddress, clientPort);
5. Send the response datagram
dgramSocket.send(outPacket)
InfoServerUDP
InfoServerUDP
Datagram Sockets
g
CLIENT:
1
Create a DatagramSocket object
1. Create a DatagramSocket object
DatagramSocket dgramSocket = new
DatagramSocket();
DatagramSocket();
2. Create the outgoing datagram
DatagramPacket outPacket = new
DatagramPacket outPacket new
DatagramPacket(message.getBytes(),
message.length(),host, port);
g
g
(),
, p
);
3. Send the datagram message
dgramSocket.send(outPacket)
g
(
)
4. Create a buffer for incoming datagrams
Datagram Sockets
Datagram Sockets
CLIENT:
5
Create a DatagramPacket object for the incoming
5. Create a DatagramPacket object for the incoming
datagram
DatagramPacket inPacket =
g
new DatagramPacket(buffer,
buffer.length);
6
A
t
i
i
d t
6. Accept an incoming datagram
dgramSocket.receive(inPacket)
7
Retrieve the data from the buffer
7. Retrieve the data from the buffer
string response = new
String(inPacket.getData(), 0,
g(
g
(),
,
inPacket.getLength());
8. Close the DatagramSocket:
InfoClientUDP
InfoClientUDP
Prinsip-prinsip yang dilakukan oleh
InfoClientUDP
B
t D t
S
k t
• Buat DatagramSocket
• Lakukan loop sampai user mengetikkan QUIT.
– Baca masukkan dari user– Tampung pada buffer array byte
B t b k D t P k t t k diki i k k
– Buat obyek DatagramPacket untuk dikirimkan ke server
– Kirimkan DatagramPacket ke server – Kirimkan DatagramPacket ke server
– Siapkan packet datagram untuk mengambil informasi dari client
– Baca DatagramPacket yang dikirim dari client