UDP and TCP Sockets in Java
UDP and TCP Sockets in Java
Socket API
socket
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
A application-created,
OS-controlled interface
(a door) into which
application process can
both send and
receive messages
to/from another
application process
application viewpoint
UDP provides unreliable transfer
of groups of bytes (datagrams)
between client and server
2: Application Layer
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
Client
create socket,
clientSocket =
DatagramSocket()
Create datagram with server IP and
port=x; send datagram via
clientSocket
2: Application Layer
Client
Process
monitor
inFromUser
keyboard
Input: receives
process
packet (recall
thatTCP received
byte stream)
UDP
packet
receivePacket
packet (recall
that TCP sent
byte stream)
sendPacket
Output: sends
UDP
packet
client
UDP
clientSocket
socket
to network
UDP
socket
from network
2: Application Layer
Create
input stream
Create
client socket
Translate
hostname to IP
address using DNS
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];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
2: Application Layer
DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
Read datagram
from server
clientSocket.receive(receivePacket);
String modifiedSentence =
new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
2: Application Layer
Create
datagram socket
at port 9876
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);
2: Application Layer
Get IP addr
port #, of
sender
Create datagram
to send to client
DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, IPAddress,
port);
Write out
datagram
to socket
serverSocket.send(sendPacket);
}
}
10
2: Application Layer
11
2: Application Layer
12
controlled by
application
developer
controlled by
operating
system
process
process
socket
TCP with
buffers,
variables
socket
TCP with
buffers,
variables
internet
controlled by
application
developer
controlled by
operating
system
host or
server
host or
server
2: Application Layer
13
application viewpoint
TCP provides reliable, in-order
transfer of bytes (pipe)
between client and server
2: Application Layer
14
Client
create socket,
port=x, for
incoming request:
welcomeSocket =
ServerSocket()
TCP
setup
create socket,
connect to hostid, port=x
clientSocket =
Socket()
send request using
clientSocket
close
connectionSocket
close
clientSocket
2: Application Layer
15
Stream jargon
input
stream
Client
Process
process
output
stream
input
stream
client
TCP
clientSocket
socket
to network
2: Application Layer
inFromServer
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.
outToServer
monitor
inFromUser
keyboard
TCP
socket
from network
16
2: Application Layer
17
Create
output stream
attached to socket
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("hostname", 6789);
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
2: Application Layer
18
BufferedReader inFromServer =
new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
sentence = inFromUser.readLine();
Send line
to server
outToServer.writeBytes(sentence + '\n');
modifiedSentence = inFromServer.readLine();
Read line
from server
19
Create
welcoming socket
at port 6789
Wait, on welcoming
socket for contact
by client
Create input
stream, attached
to socket
2: Application Layer
20
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
}
}
2: Application Layer
21
2: Application Layer
22