Java Datagrams

UDP communication in Java applications

📡 What are Java Datagrams?

Datagrams use UDP protocol for fast, connectionless communication in Java. They're ideal for real-time applications like gaming or streaming where speed matters more than guaranteed delivery.


// Basic datagram example
DatagramSocket socket = new DatagramSocket();
byte[] data = "Hello UDP!".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, 
    InetAddress.getByName("localhost"), 8080);
socket.send(packet);
                                    

Datagram Components

📦

DatagramPacket

Container for UDP data

DatagramPacket packet = new DatagramPacket(data, length);
🔌

DatagramSocket

UDP communication endpoint

DatagramSocket socket = new DatagramSocket(port);
🏠

InetAddress

Network address representation

InetAddress address = InetAddress.getByName("localhost");

UDP Protocol

Fast, connectionless communication

// No connection needed, just send!

🔹 UDP Client (Sender)

Send data using UDP datagrams:

import java.net.*;
import java.io.*;

public class UDPClient {
    public static void main(String[] args) {
        try {
            // Create datagram socket
            DatagramSocket socket = new DatagramSocket();
            
            // Prepare data to send
            String message = "Hello UDP Server!";
            byte[] data = message.getBytes();
            
            // Get server address
            InetAddress serverAddress = InetAddress.getByName("localhost");
            
            // Create datagram packet
            DatagramPacket packet = new DatagramPacket(
                data, data.length, serverAddress, 8080);
            
            // Send packet
            socket.send(packet);
            System.out.println("Message sent: " + message);
            
            // Prepare to receive response
            byte[] responseData = new byte[1024];
            DatagramPacket responsePacket = new DatagramPacket(
                responseData, responseData.length);
            
            // Receive response
            socket.receive(responsePacket);
            String response = new String(responsePacket.getData(), 
                0, responsePacket.getLength());
            System.out.println("Server response: " + response);
            
            // Close socket
            socket.close();
            
        } catch (Exception e) {
            System.out.println("Client error: " + e.getMessage());
        }
    }
}

🔹 UDP Server (Receiver)

Receive and respond to UDP datagrams:

import java.net.*;
import java.io.*;

public class UDPServer {
    public static void main(String[] args) {
        try {
            // Create datagram socket on port 8080
            DatagramSocket socket = new DatagramSocket(8080);
            System.out.println("UDP Server started on port 8080");
            
            while (true) {
                // Prepare to receive data
                byte[] receiveData = new byte[1024];
                DatagramPacket receivePacket = new DatagramPacket(
                    receiveData, receiveData.length);
                
                // Receive packet
                socket.receive(receivePacket);
                
                // Extract message
                String message = new String(receivePacket.getData(), 
                    0, receivePacket.getLength());
                System.out.println("Received: " + message);
                
                // Get client address and port
                InetAddress clientAddress = receivePacket.getAddress();
                int clientPort = receivePacket.getPort();
                
                // Prepare response
                String response = "Echo: " + message;
                byte[] responseData = response.getBytes();
                
                // Create response packet
                DatagramPacket responsePacket = new DatagramPacket(
                    responseData, responseData.length, 
                    clientAddress, clientPort);
                
                // Send response
                socket.send(responsePacket);
                System.out.println("Response sent");
            }
            
        } catch (Exception e) {
            System.out.println("Server error: " + e.getMessage());
        }
    }
}

Server Output:

UDP Server started on port 8080

Received: Hello UDP Server!

Response sent

🔹 UDP vs TCP Comparison

Understanding the differences between UDP and TCP:

UDP (User Datagram Protocol):

  • Speed: Faster, no connection overhead
  • Reliability: No guarantee of delivery
  • Connection: Connectionless protocol
  • Order: No guarantee of packet order
  • Use cases: Gaming, live streaming, DNS queries

TCP (Transmission Control Protocol):

  • Speed: Slower due to connection management
  • Reliability: Guaranteed delivery and error correction
  • Connection: Connection-oriented protocol
  • Order: Maintains packet order
  • Use cases: Web browsing, file transfer, email

🔹 Broadcast Example

Send data to multiple recipients using broadcast:

import java.net.*;

public class UDPBroadcast {
    public static void main(String[] args) {
        try {
            // Create socket
            DatagramSocket socket = new DatagramSocket();
            
            // Enable broadcast
            socket.setBroadcast(true);
            
            // Prepare broadcast message
            String message = "Broadcast message to all!";
            byte[] data = message.getBytes();
            
            // Broadcast address (255.255.255.255)
            InetAddress broadcastAddress = 
                InetAddress.getByName("255.255.255.255");
            
            // Create broadcast packet
            DatagramPacket packet = new DatagramPacket(
                data, data.length, broadcastAddress, 8080);
            
            // Send broadcast
            socket.send(packet);
            System.out.println("Broadcast sent: " + message);
            
            socket.close();
            
        } catch (Exception e) {
            System.out.println("Broadcast error: " + e.getMessage());
        }
    }
}

🔹 Common Datagram Methods

Important methods for working with datagrams:

DatagramSocket Methods:

  • send(DatagramPacket): Send a datagram packet
  • receive(DatagramPacket): Receive a datagram packet
  • setBroadcast(boolean): Enable/disable broadcast
  • setSoTimeout(int): Set receive timeout
  • close(): Close the socket

DatagramPacket Methods:

  • getData(): Get packet data as byte array
  • getLength(): Get data length
  • getAddress(): Get sender/receiver address
  • getPort(): Get sender/receiver port

🧠 Test Your Knowledge

Which protocol do Java datagrams use?