1. Jan. 2004 1
Java Networking UDP
Yangjun Chen
Dept. Business Computing
University of Winnipeg
2. Jan. 2004 2
User Datagram Protocol
• UDP (User Datagrarn Protocol)
- a protocol that sends independent packets of data, called
datagrams,
from one computer to another with no guarantees about arrival
- not connection based like TCP
• If a UDP packet is lost, IT’S LOST.
• The packets appear in the order they are received not
necessarily in the order they were sent.
3. Jan. 2004 3
So Why UDP?
• Speed!
• UDP can be up to three times faster than TCP.
• There are applications where speed is more important than
reliability, such as audio and video data.
4. Jan. 2004 4
UDP
• Java classes using UDP
- java. net
DatagramPacket()
DatagramSocket()
5. Jan. 2004 5
UDP Classes
• Java has two classes for UDP support
• java.net.DatagramSocket
• java.net.DatagramPacket
• A DatagramSocket is used to send and receive
DatagramPacket.
• Since UDP is connectionless, streams are not used.
• The maximum size of a Datagrarm packet is
limited to slightly less than 64Kbytes.
6. Jan. 2004 6
UDP Classes
• DatagramSockets are connected to a port that allow for
sending and receiving of data.
• Unlike TCP sockets, there is no distinction between client and
server sockets in UDP.
• Also, a DatagramSocket can be used to send data to multiple
different hosts.
- This is because the address is stored in the packet, not in
the socket.
• There are 65,536 UDP ports as well as TCP ports that are
separate from each other.
7. Jan. 2004 7
DatagramPacket Class
• You construct a DatagrarmPacket by using one of the two
constructors.
- public DatagramPacket(byte[] data, int length)
- public DatagramPacket(byte[] data, int length,
InetAddress addr, int port)
• The byte array is passed by reference and not by value. A
change in its contents will change the packet.
8. Jan. 2004 8
DatagramPacket Class
• Example of using the constructors:
String data = "My UDP Packet”;
byte[] h = data.getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length)
• You can also pass in the host and port to which the packet is to
be sent.
9. Jan. 2004 9
DatagramPacket Class
try {
InetAddress tr = new
InetAddress(" www.win.trlabs.ca”);
int port = 9100;
String data = "Another UDP Packet";
byte[] b = data.getBytes( );
DatagramPacket dp = new DatagramPacket(b,
b.length, tr,port);
}//try
catch (UnknownHostException e) {
System.err.printin(e);
}//catch
10. Jan. 2004 10
DatagramPacket Class
• After creation of a DatagramPacket, it is possible to change the
date, the length of the data, the port, or the address by using
the following methods:
setAddress(InetAddress addr)
setPort(int port)
setData(byte buf[])
setLength(int length)
• To retrieve the current status of a DatagramPacket, use the
corresponding get methods.
11. Jan. 2004 11
DatagramSocket Class
• This class is a connection to a port that does the transmitting
and receiving.
• Unlike TCP sockets, the same Datagramsocket can be used to
send and receive.
• The Datagramsocket class has three constructors.
12. Jan. 2004 12
DatagramSocket Class
• public DatagramSocket()
• public DatagramSocket(int port)
• public Datagramsocket(int port, InetAddress addr)
• all three constructors throw an IOException.
• The first constructor is mainly used to act as clients.
• The other two that specify a port and optionally an IP address
are intended for servers that must run on a well known port.
13. Jan. 2004 13
Sending UDP Datagrams
• 1) Convert the data into a byte array.
• 2) Pass this byte array, length of data, port and address to the
DatagramPacket constructor.
• 3) Create a DatagramSocket object.
• 4) Pass the Datagram packet to the send method.
14. Jan. 2004 14
Sending UDP Datagrams
try {
TnetAddress tr=new
InetAddress("win.tr1abs.ca”);
int pt=9100;
string data = "Sending a Datagram";
byte[] b = data.getBytes();
DatagramPacket dP=new
DatagramPacket(b,b.length,tr,pt);
}//try catch (UnknownHostException e) {
system.err.println(e);
}//catch
16. Jan. 2004 16
Receiving UDP Datagrams
• 1) Construct a DatagramSocket object on the port you wish to
listen.
• 2) Pass it an empty Datagrampacket object to the
Datagramsocket’s receive() method.
• 3) Use methods
getport ( ),
getAddress( ),
getData ( ),
getLength( )
to retrieve information about the data.
18. Jan. 2004 18
UDP Echo Example
• As with the TCP echo port, the UDP echo port is port 7.
• When this port receives a datagram, it copies the data and
sends it back to the user.
• As with the TCP echo example, the UDP echo example will
read in data from System.in, send it to the echo server on port
7 and then display the results.
• Remember that since UDP is connectionless, a packet might be
lost somewhere between the client and the server.
19. Jan. 2004 19
UDP Echo Example
import java.io.*;
import java.net.*;
public class UDPEcho extends Thread {
static int port=7;
static volatile boolean running=false;
DatagramSocket ds;
public static void main(String args[]) {
InputstreamReader isr=new
InputStreamReader(System.in);
BufferedReader in = new
BufferedReader(isr);
String line;
20. Jan. 2004 20
UDP Echo Example
running=true;
try{
while ((line==in.readLine()) != null) {
byte[] data = line.getBytes();
DatagramPacket dP = new DatagramPacket
(data, data.length, server, port);
ds.send(dp);
Thread.yield();
}//while
}//try