230 likes | 382 Views
Java Networking UDP Yangjun Chen Dept. Business Computing University of Winnipeg. 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
E N D
Java Networking UDP Yangjun Chen Dept. Business Computing University of Winnipeg
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.
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.
UDP • Java classes using UDP • - java. net • DatagramPacket() • DatagramSocket()
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.
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.
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.
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.
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
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.
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.
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.
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.
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
Sending UDP Datagrams try { DatagramSocket sender = new Datagramsocket(); sender.send(dP); }//try catch (IOException e) { system.out.printIn(e); }//catch
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.
Receiving UDP Datagrams try { byte buf=new byte[655361; DatagramPacket dp = new DatagramPacket(buf, buf.length); DatagramSocket ds=newDatagramSocket(9100); ds.receive(dp); byte[] data=dp.getData(); String s=new String(data, 0, data.getLength()); System.out.println(s); }//try catch (IOException e) { System.err.println(e); }//catch
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.
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;
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
UDP Echo Example catch(IoException e) { system.err.println(e); } //catch running = false; } //main public UDPEcho(DatagramSocket ds) { this.ds=ds; } //UDPEcho constructor
UDP Echo Example public void run() { byte[] buf = new byte[1024]; String line; DatagramPacket incoming = new DatagramPacket (buf, buf.length); while(running) { try{ ds.receive(incoming); byte[] data = incoming.getData(); line = new String(data,0,incoming.getLength());
UDP Echo Example System.out.println("Echo: ", line); } //try catch(IOException e){ system.err.println(e); }//catch }//while }//run }//UDPEcho class