1 of 36

2: Application Layer

1

Chapter 2�Application Layer:

Socket Programming

Jaringan Komputer

Departemen Informatika

Universitas Diponegoro

2 of 36

Network Applications

  1. Protocol standard defined 🡪 RFC
    • RFC 959 🡪 FTP
  2. Proprietary
    • single developer 🡪 client-server
    • Not to use one of the well-known port numbers defined in the RFC.

​

T C P or UDP ?

    • T C P 🡪 connection oriented, reliable
    • UDP 🡪 connectionless, unreliable

​

​

2: Application Layer

2

3 of 36

Example of �Client Server Communication

2: Application Layer

3

4 of 36

Socket programming

Socket API

  • introduced in BSD4.1 UNIX, 1981
  • explicitly created, used, released by apps
  • client/server paradigm
  • two types of transport service via socket API:
    • UDP
    • TCP

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

5 of 36

Socket programming basics

  • Server must be running before client can send anything to it.
  • Server must have a socket (door) through which it receives and sends segments
  • Similarly client needs a socket
  • Socket is locally identified with a port number
    • Analogous to the apt # in a building
  • Client needs to know server IP address and socket port number.

​

2: Application Layer

5

6 of 36

Chapter 2: Application layer

  • 2.1 Principles of network applications
  • 2.2 Web and HTTP
  • 2.3 FTP (skip)
  • 2.4 Electronic Mail
    • SMTP, POP3, IMAP
  • 2.5 DNS

​

  • 2.6 P2P applications (skip)
  • 2.7 Socket programming with TCP
  • 2.8 Socket programming with UDP

2: Application Layer

6

7 of 36

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

8 of 36

TCP: Client Socket, Welcoming Socket, and Connection Socket

2: Application Layer

8

1

2

3

9 of 36

Socket programming with TCP

Client must contact server

  • server process must first be running
  • server must have created socket (door) that welcomes client’s contact

Client contacts server by:

  • creating client-local TCP socket
  • specifying IP address, port number of server process
  • When client creates socket: client TCP establishes connection to server TCP

​

  • When contacted by client, server TCP creates new socket for server process to communicate with client
    • allows server to talk with multiple clients
    • source port numbers used to distinguish clients (more in Chap 3)

2: Application Layer

9

TCP provides reliable, in-order

transfer of bytes (“pipe”)

between client and server

application viewpoint

10 of 36

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

11 of 36

  • A stream is a sequence of characters that flow into or out of a process.
  • An input stream is attached to some input source for the process, e.g., keyboard or socket.
  • An output stream is attached to an output source, e.g., monitor or socket.
  • The DataOutputStream class has some methods to convert (and send out) data into any primitif data type, depend on our need; Such as byte, integer, char, etc

2: Application Layer

11

Client

process

client TCP socket

Stream jargon

12 of 36

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

13 of 36

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

14 of 36

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

15 of 36

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

16 of 36

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

17 of 36

TCP observations & questions

  • Server has two types of sockets:
    • ServerSocket and Socket
  • When client knocks on serverSocket’s “door,” server creates connectionSocket and completes TCP conx.
  • Dest IP and port are not explicitly attached to segment.
  • Can multiple clients use the server?

�

​

2: Application Layer

17

18 of 36

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();

}

}

19 of 36

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();

}

}

20 of 36

Chapter 2: Application layer

  • 2.1 Principles of network applications
  • 2.2 Web and HTTP
  • 2.3 FTP (skip)
  • 2.4 Electronic Mail
    • SMTP, POP3, IMAP
  • 2.5 DNS

​

  • 2.6 P2P applications (skip)
  • 2.7 Socket programming with TCP
  • 2.8 Socket programming with UDP

2: Application Layer

20

21 of 36

Socket programming with UDP

UDP: no “connection” between client and server

  • no handshaking
  • sender explicitly attaches IP address and port of destination to each segment
  • OS attaches IP address and port of sending socket to each segment
  • Server can extract IP address, port of sender from received segment

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”.

22 of 36

Running example

  • Client:
    • User types line of text
    • Client program sends line to server
  • Server:
    • Server receives line of text
    • Capitalizes all the letters
    • Sends modified line to client
  • Client:
    • Receives line of text
    • Displays

2: Application Layer

22

23 of 36

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

24 of 36

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

25 of 36

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

26 of 36

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

27 of 36

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

28 of 36

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

29 of 36

UDP observations & questions

  • Both client server use DatagramSocket
  • Dest IP and port are explicitly attached to segment.
  • What would happen if change both clientSocket and serverSocket to “mySocket”?
  • Can the client send a segment to server without knowing the server’s IP address and/or port number?
  • Can multiple clients use the server?

�

​

2: Application Layer

29

30 of 36

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();

}

}

31 of 36

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();

}

}

32 of 36

Appendix

  • Java Network Programming
  • Java I/O byte stream
  • Java I/O char stream
  • High level class in stream chaining

​

2: Application Layer

32

33 of 36

Java Network Programming

  • Java.io
    • InputStream, OutputStream 🡪 byte
    • Reader, Writer 🡪 text
  • Java.net
    • TCP Programming
      • Java.net.Socket 🡪 client, server
      • Java.net.ServerSocket 🡪 server
    • UDP Programming
      • Java.net.DatagramSocket 🡪 client, server
      • Java.net.DatagramPacket 🡪 create packet

2: Application Layer

33

34 of 36

Java I/O�byte streams

35 of 36

Java I/O�char streams

36 of 36

High Level Class�In Stream Chaining