Программирование на Java [Н. А. Вязовик] (fb2) читать постранично, страница - 163

- Программирование на Java 2.38 Мб, 466с. скачать: (fb2) - (исправленную)  читать: (полностью) - (постранично) - Н. А. Вязовик

 [Настройки текста]  [Cбросить фильтры]

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);

return result;

}

}

Пример 16.4.

Заключение

В данном разделе были рассмотрены теоретические основы сети как одной большой взаимодействующей системы. Были описаны все уровни модели OSI и их функциональные назначения. Также были представлены основные утилиты, используемые для настройки и обнаружения неисправностей в сети. Затем были рассмотрены средства Java для работы с наиболее распространенными сетевыми протоколами. Приведен подробный пример и для более сложного случая – сервер, обслуживающий несколько клиентов одновременно.