Question:
I would like to create an application in Java that communicates with a UDP connection. How do you specify the connection as UDP rather than TCP?
Answer:
To write UDP clients and servers, you have to use the DatagramSocket
class. UDP is a connectionless protocol, so a UDP server doesn’t have to perform an accept()
operation the way a TCP server using ServerSocket
must. Unlike Socket
, you do not communicate by writing to an OutputStream
and reading from an InputStream
. Rather, you send datagrams using the DatagramPacket
class. Each packet you receive must have a predefined size and byte
buffer. Each packet you sendmust also have a destination address and port number associated with it. The easiest way to give you the feel for how it all works is towrite a sample program. The following program connects to the UDP daytime service on a host and prints the result. The key item to pay attention to is the difference between a send and receive packet. Send packets contain address information, receive packets don’t. The raw byte data in a packet can be accessed with getData()
and the length of the actual data in the byte array (rather than the length of the array itself), can be obtained with getLength()
.
import java.io.*;import java.net.*;public class Daytime { public static final int DAYTIME_PORT = 13; public static final String getTime(String hostname) throws IOException { InetAddress host; DatagramSocket socket = new DatagramSocket(); byte[] dummyData = new byte[1]; byte[] timeData = new byte[256]; DatagramPacket sendPacket, receivePacket; host = InetAddress.getByName(hostname); sendPacket = new DatagramPacket(dummyData, dummyData.length, host, DAYTIME_PORT); receivePacket = new DatagramPacket(timeData, timeData.length); socket.send(sendPacket); socket.receive(receivePacket); return new String(receivePacket.getData(), 0, receivePacket.getLength()); } public static void main(String[] args) { String server = "tock.usno.navy.mil"; if(args.length == 1) server = args[0]; else if(args.length > 1) { System.err.println("Usage: Daytime [hostname]"); return; } try { // Time should include newline, so we don't use println(). System.out.print(getTime(server)); System.out.flush(); } catch(IOException e) { e.printStackTrace(); return; } } }