Массив содержит данные для отправки (созданный пакет будет иметь длину, равную length ), а адрес и порт указывают получателя пакета. После этого вызывается метод send() класса DatagramSocket.
try { DatagramSocket s = new DatagramSocket(); byte data[]={1, 2, 3}; InetAddress addr = InetAddress.getByName('localhost'); DatagramPacket p = new DatagramPacket(data, 3, addr, 3456); s.send(p); System.out.println('Datagram sent'); s.close(); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
Для получения датаграммы также создается экземпляр класса DatagramPacket, но в конструктор передается лишь массив, в который будут записаны полученные данные (также указывается ожидаемая длина пакета). Сокет необходимо создать с указанием порта, иначе, скорее всего, сообщение просто не дойдет до адресата. Используется метод receive() класса DatagramSocket (аналогично методу ServerSocket.accept(), этот метод также прерывает выполнение потока, пока не придет запрос от клиента). Пример реализации получателя:
try { DatagramSocket s = new DatagramSocket(3456); byte data[]=new byte[3]; DatagramPacket p = new DatagramPacket(data, 3); System.out.println('Waiting...'); s.receive(p); System.out.println('Datagram received: '+ data[0]+', '+data[1]+', '+data[2]); s.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
Если запустить сначала получателя, а затем отправителя, то можно увидеть, что первый напечатает содержимое полученной датаграммы, а потом программы завершат свою работу.
В заключение приведем пример сервера, который получает датаграммы и отправляет их обратно, дописав к ним слово received.
import java.io.*; import java.net.*; public class DatagramDemoServer { public static final int PORT = 2000; private static final int LENGTH_RECEIVE = 1; private static final byte[] answer = ('received').getBytes(); private DatagramSocket servSocket = null; private boolean keepRunning = true; public static void main(String[] args) { DatagramDemoServer server = new DatagramDemoServer(); server.service(); } public DatagramDemoServer() { try { servSocket = new DatagramSocket(PORT); } catch(SocketException e) { System.err.println('Unable to open socket : ' + e.toString()); } } protected void service() { DatagramPacket datagram; InetAddress clientAddr; int clientPort; byte[] data; while (keepRunning) { try { data = new byte[LENGTH_RECEIVE]; datagram = new DatagramPacket(data, data.length); servSocket.receive(datagram); clientAddr = datagram.getAddress(); clientPort = datagram.getPort(); data = getSendData(datagram.getData()); datagram = new DatagramPacket(data, data.length, clientAddr, clientPort); servSocket.send(datagram); } catch(IOException e) { System.err.println('I/O Exception : ' + e.toString()); } } } protected byte[] getSendData(byte b[]) { byte[] result = new byte[b.length+answer.length]; System.arraycopy(b, 0, result, 0, b.length); System.arraycopy(answer, 0, result, b.length, answer.length);