[ Team LiB ] Previous Section Next Section

5.12 Receiving Datagrams

Example 5-12 is a program that sits and waits to receive datagrams. When it receives one, it prints out the contents of the datagram and the name of the host that sent it.

To receive a datagram, you must first create a DatagramSocket that listens on a particular port of the local host. This socket can receive only those packets sent to that particular port. Then, you must create a DatagramPacket with a byte buffer into which datagram data is stored. Finally, you call the DatagramSocket.receive( ) method to wait for a datagram to arrive on the specified port. When it does, the data it contains is transferred into the specified buffer, and receive( ) returns. If the datagram contains more bytes than fit into the specified buffer, the extra bytes are discarded. When a datagram arrives, receive( ) also stores the host and port that the datagram was sent from into the packet.

Example 5-12. UDPReceive.java
package je3.net;
import java.io.*;
import java.net.*;

 * This program waits to receive datagrams sent to the specified port.
 * When it receives one, it displays the sending host and prints the
 * contents of the datagram as a string.  Then it loops and waits again.
public class UDPReceive {
    public static final String usage = "Usage: java UDPReceive <port>";
    public static void main(String args[  ]) {
        try {
            if (args.length != 1) 
                throw new IllegalArgumentException("Wrong number of args");
            // Get the port from the command line
            int port = Integer.parseInt(args[0]);
            // Create a socket to listen on the port.
            DatagramSocket dsocket = new DatagramSocket(port);
            // Create a buffer to read datagrams into.  If anyone sends us a 
            // packet containing more than will fit into this buffer, the
            // excess will simply be discarded!
            byte[  ] buffer = new byte[2048];
            // Create a packet to receive data into the buffer
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

            // Now loop forever, waiting to receive packets and printing them.
            for(;;) {
                // Wait to receive a datagram

                // Decode the bytes of the packet to characters, using the 
                // UTF-8 encoding, and then display those characters.
                String msg = new String(buffer, 0, packet.getLength( ),"UTF-8");
                System.out.println(packet.getAddress( ).getHostName( ) +
                                   ": " + msg);
                // Reset the length of the packet before reusing it.
                // Prior to Java 1.1, we'd just create a new packet each time.
        catch (Exception e) {
    [ Team LiB ] Previous Section Next Section