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
dsocket.receive(packet);
// 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.
packet.setLength(buffer.length);
}
}
catch (Exception e) {
System.err.println(e);
System.err.println(usage);
}
}
}