| |
(9998);
// Создаем пакет для приема команд
pinp = new DatagramPacket(buf, 512);
// Цикл обработки команд, полученных от клиента
while(true)
{
// Принимаем пакет от клиента
s.receive(pinp);
// Получаем адрес узла, приславшего пакет
SrcAddress = pinp.getAddress();
// Получаем порт, на котором был передан пакет
SrcPort = pinp.getPort();
// Отображаем принятую команду на консоли сервера
// Формируем строку из принятого блока
String str = new String(buf, 0);
// Обрезаем строку, удаляя символ конца строки
StringTokenizer st;
st = new StringTokenizer(str, "\r\n");
str = new String((String)st.nextElement());
// Выводим строку команды на консоль
System.out.println("> " + str + " < " +
"port: " + SrcPort);
// Если пришла команда 'quit', прерываем цикл
if(str.equals("quit"))
break;
}
// Закрываем сокет сервера
s.close();
}
catch(Exception ioe)
{
System.out.println(ioe.toString());
}
try
{
System.out.println(
"Press to terminate application...");
System.in.read(bKbdInput);
}
catch(Exception ioe)
{
System.out.println(ioe.toString());
}
}
}
Описание исходного текста приложения DatagramServer
Внутри функции main мы определили несколько переменных.
Массив bKbdInput хранит строку, введенную с клавиатуры.
Массив buf используется для хранения строк (команд), которые сервер получает
от клиентских приложений.
В переменной s класса DatagramSocket хранится ссылка на датаграмный сокет,
который будет использован для приема команд от клиентских приложений.
Переменная pinp класса DatagramPacket хранит пакеты, полученные сервером из
сети.
Переменные SrcAddress (класса InetAddress) и SrcPort типа int хранят,
соответственно, адрес и порт узла, отправившего пакет.
Первое, что делает сервер - это создание датаграммного сокета:
s = new DatagramSocket(9998);
Конструктору передается номер порта 9998, на котором сервер будет принимать
пакеты данных от клиентских приложений.
После создания сокета сервер создает объекта класса DatagramPacket, в
который будут записываться приходящие от клиентов пакеты:
pinp = new DatagramPacket(buf, 512);
Конструктор пакета получает ссылку на массив buf, в который нужно будет
записывать приходящие по сети данные, и размер этого массива, равный 512 байт.
Далее сервер запускает цикл приема пакетов и отображения их содержимого.
Пакет принимается простым вызовом метода receive из класса DatagramSocket:
s.receive(pinp);
Этот метод блокирует работу вызвавшей его задачи до тех пор, пока по данному
сокету не будет получен пакет данных.
Когда пакет будет получен, наше приложение определяет адрес и порт
отправителя:
SrcAddress = pinp.getAddress();
SrcPort = pinp.getPort();
Эта информация может пригодиться, если вы будете посылать отправителю
ответный пакет.
Наше приложение ответные пакеты не посылает. Оно преобразует принятые данные
в текстовую староку класса String, добавляет к этой строке номер порта
отправителя и отображает эту информацию на консоли:
System.out.println("> " + str + " < " + "port: " +
SrcPort);
Цикл приема команд завершается, если от клиента пришла строка “quit”:
if(str.equals("quit"))
break;
Перед тем как завершить свою работу, наше приложение закрывает датаграммный
сокет, вызывая для этого метод close:
s.close();
Исходный текст приложения DatagramClient
В листинге 3.8 приведен исходный текст приложения DatagramClient.
Листинг 3.8. Файл Dat
|
|