2: Application Layer
1
Chapter 2�Application Layer:
Socket Programming
Jaringan Komputer
Departemen Informatika
Universitas Diponegoro
Network Applications
T C P or UDP ?
2: Application Layer
2
Example of �Client Server Communication
2: Application Layer
3
Socket programming
Socket API
2: Application Layer
4
An application-created,
OS-controlled interface (a “door”) into which
application process can both send and
receive messages to/from another application process
socket
Goal: learn how to build client/server application that communicate using sockets
Socket programming basics
2: Application Layer
5
Chapter 2: Application layer
2: Application Layer
6
Socket-programming using TCP
TCP service: reliable transfer of bytes from one process to another
2: Application Layer
7
process
TCP with
buffers,
variables
socket
controlled by
application
developer
controlled by
operating
system
host or
server
process
TCP with
buffers,
variables
socket
controlled by
application
developer
controlled by
operating
system
host or
server
internet
TCP: Client Socket, Welcoming Socket, and Connection Socket
2: Application Layer
8
1
2
3
Socket programming with TCP
Client must contact server
Client contacts server by:
2: Application Layer
9
TCP provides reliable, in-order
transfer of bytes (“pipe”)
between client and server
application viewpoint
Client/server socket interaction: TCP
2: Application Layer
10
wait for incoming
connection request
connectionSocket =
welcomeSocket.accept()
create socket,
port=x, for
incoming request:
welcomeSocket =
ServerSocket()
create socket,
connect to hostid, port=x
clientSocket =
Socket()
close
connectionSocket
read reply from
clientSocket
close
clientSocket
Server (running on hostid)
Client
send request using
clientSocket
read request from
connectionSocket
write reply to
connectionSocket
TCP
connection setup
2: Application Layer
11
Client
process
client TCP socket
Stream jargon
Socket programming with TCP
Example client-server app scenario:
1) client reads line from standard input (inFromUser stream) , sends to server via socket (outToServer stream)
2) server reads line from socket
3) server converts line to uppercase,
4) Server sends back to client
5) client reads, prints modified line from socket (inFromServer stream)
Let’s Code the Client and Server Programs…
2: Application Layer
12
client TCP socket
Example: �Java client (TCP)
2: Application Layer
13
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());
Create
input stream
Create
client socket,
connect to server
Create
output stream
attached to socket
Example: �Java client (TCP), �cont.
2: Application Layer
14
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();
}
}
Create
input stream
attached to socket
Send line
to server
Read line
from server
Example: �Java server (TCP)
2: Application Layer
15
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()));
Create
welcoming socket
at port 6789
Wait, on welcoming
socket for contact
by client
Create input
stream, attached
to socket
Example: �Java server (TCP), �cont
2: Application Layer
16
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
}
}
Read in line
from socket
Create output
stream, attached
to socket
Write out line
to socket
End of while loop,
loop back and wait for
another client connection
TCP observations & questions
�
2: Application Layer
17
Exercise: Java client (TCP)
2: Application Layer
18
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
// 1. .......................................................................................
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
// 2. .......................................................................................
Socket clientSocket = new Socket("hostname", 6789);
// 3. .......................................................................................
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
// 4. .......................................................................................
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// 5. .......................................................................................
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
// 6. .......................................................................................
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
// 7. .......................................................................................
clientSocket.close();
}
}
Java client (TCP)
2: Application Layer
19
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
// 1. Membuat objek yang menerima aliran karakter dari perangkat input user (keyboard)
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
// 2. Membuat objek socket pd klien dg mencoba melakukan koneksi ke mesin hostname pd port 6789
Socket clientSocket = new Socket("hostname", 6789);
// 3. Membuat objek untuk mengirimkan aliran data melalui socket
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
// 4. Membuat objek untuk menerima aliran karakter dari socket
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// 5. Membaca baris karakter dari keyboard, lalu mengirim baris karakter tsb ke socket dlm aliran Byte
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
// 6. membaca baris karakter yg datang dari socket, lalu mengirim ke perangkat output user (monitor)
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
// 7. Menutup socket klien
clientSocket.close();
}
}
Chapter 2: Application layer
2: Application Layer
20
Socket programming with UDP
UDP: no “connection” between client and server
2: Application Layer
21
application viewpoint
UDP provides unreliable transfer
of groups of bytes (“datagrams”)
between client and server
Note: the official terminology
for a UDP packet is “datagram”. �In this class, we instead use “UDP �segment”.
Running example
2: Application Layer
22
Client/server socket interaction: UDP
2: Application Layer
23
Server (running on hostid)
close
clientSocket
read datagram from
clientSocket
create socket,
clientSocket =
DatagramSocket()
Client
Create datagram with server IP and
port=x; send datagram via� clientSocket
create socket,
port= x.
serverSocket =
DatagramSocket()
read datagram from
serverSocket
write reply to
serverSocket
specifying �client address,
port number
Example: Java client (UDP)
2: Application Layer
24
Output: sends packet (recall
that TCP sent “byte stream”)
Input: receives packet (recall thatTCP received “byte stream”)
Client
process
client UDP socket
Example: �Java client (UDP)
2: Application Layer
25
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]; // 1 Kbyte
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes(); // get bytes from sentence
Create
input stream
Create
client socket
Translate
hostname to IP
address using DNS
Example: �Java client (UDP), �cont.
2: Application Layer
26
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();
}
}
Create datagram with data-to-send,
length, IP addr, port
Send datagram
to server
Read datagram
from server
Example: �Java server (UDP)
2: Application Layer
27
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);
Create
datagram socket
at port 9876
Create space for
received datagram
Receive
datagram
Example: �Java server (UDP), �cont
2: Application Layer
28
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);
}
}
}
Get IP addr
port #, of
sender
Write out
datagram
to socket
End of while loop,
loop back and wait for
another datagram
Create datagram
to send to client
UDP observations & questions
�
2: Application Layer
29
Exercise: Java client (UDP)
2: Application Layer
30
class UDPClient {
public static void main(String args[]) throws Exception
{
// 1. .......................................................................................
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
// 2. .......................................................................................
DatagramSocket clientSocket = new DatagramSocket();
// 3. .......................................................................................
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
// 4. .......................................................................................
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
// 5. .......................................................................................
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
// 6. .......................................................................................
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
// 7. .......................................................................................
clientSocket.close();
}
}
Exercise: Java client (UDP)
2: Application Layer
31
class UDPClient {
public static void main(String args[]) throws Exception
{
// 1. Membuat objek untuk menerima input dari user
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
// 2. Membuat objek socket klien UDP
DatagramSocket clientSocket = new DatagramSocket();
// 3. Mencatat IP server, menyiapkan ukuran byte data untuk kirim/ terima
InetAddress IPAddress = InetAddress.getByName("hostname");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
// 4. Membaca baris karakter dari keyboard, lalu mengubah data dalam Byte
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
// 5. Membuat objek paket (kirim) lalu mengirimkannya melalui socket
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
// 6. Membuat objek paket (terima) lalu menerima paket dari socket, dan menampilkan pada monitor
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
// 7. menutup koneksi socket
clientSocket.close();
}
}
Appendix
2: Application Layer
32
Java Network Programming
2: Application Layer
33
Java I/O�byte streams
Java I/O�char streams
High Level Class�In Stream Chaining