Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Po_Tp.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.44 Mб
Скачать

4.3 Пример использования датаграммных сокетов

Рассмотрим в качестве примера два приложения SеrverDatagram и ClientDatagram (пример 2), работающих с датаграммными сокетами. Одно из них выполняет роль сервера, а другое служит клиентом. Эти приложения иллюстрируют применение датаграммных сокетов для передачи данных от нескольких копий одного и того же клиентского приложения одному серверу с его известными адресом и номером порта.

Клиентские приложения посылают серверу строки, которые пользователь вводит с клавиатуры. Сервер принимает эти строки, отображая их в своем консольные вместе с номером порта клиента и его адресом. Когда с консоли клиента будет введена строка «QUIT» (или «quit»), этот клиент и сервер завершают свою работу. Работа других клиентов может быть завершена подобным образом, причем независимо от того, работает север или нет.

/*------------- Пример 2. Файл ServerDatagram.java -------------*/

import java.io.*;

import java.net.*;

import java.util.*;

class ServerDatagram

{ public static void main(String args[])

{ boolean quit=false;

String str; StringTokenizer strFull;

System.out.println("Server Application");

System.out.println("---- Start ----");

byte buf[]=new byte[512]; // буфер для данных

InetAddress srcAdd; // адрес узла, откуда пришел пакет

int srcPort; // порт, откуда пришел пакет

try

{ // создание сокета сервера

DatagramSocket s=new DatagramSocket(9999);

// создание пакета для приема команд

DatagramPacket pIn=new DatagramPacket(buf,512);

// цикл получения команд от клиента

while(!quit)

{ // ---- получение данных от клиентов

s.receive(pIn); // получение пакета

srcAdd=pIn.getAddress(); // адрес узла-отправителя

srcPort=pIn.getPort(); // порт узла-отправителя

// ---- при получении "quit" - выход

// удаление незначащих байт из массива

strFull=new StringTokenizer(new String(buf,0),"\r\n");

str=(String)strFull.nextElement();

if(str.toLowerCase().equals("quit")) quit=true;

// ---- вывод полученной от клиента строки

str="Address:"+srcAdd.toString()+

" Port:"+srcPort+" String:"+str;

System.out.println(str);

}

s.close(); // закрытие сокета

}

catch(IOException ioe)

{ System.out.println(ioe.toString());

}

System.out.println("---- Finish ----");

}

}

/*------------- Пример 2. Файл ClientDatagram.java -------------*/

import java.io.*;

import java.net.*;

import java.util.*;

class ClientDatagram

{ public static void main(String args[])

{ boolean quit=false; int length;

String str; StringTokenizer strFull;

System.out.println("Client Application");

System.out.println("Enter any string or 'quit' to exit...");

byte buf[]=new byte[512]; // буфер для передачи данных

try

{ // создание сокета клиента с

// использованием свободного порта

DatagramSocket s=new DatagramSocket();

// адрес узла, на котором запущен сервер

// в процессе отладки сетевых приложений, когда

// сервер и клиент работают на одном узле,

// в качестве адреса сервера используется адрес

// данного локального узла, выдаваемый методом

// InetAddress.getLocalHost();

InetAddress serverAdd=InetAddress.getLocalHost();

// в рабочей версии клиента указывается IP-адрес сервера

//InetAddress serverAdd=

// InetAddress.getByName("194.84.124.60");

//InetAddress serverAdd=InetAddress.getByName("gosha");

//InetAddress serverAdd=

// InetAddress.getByName("gosha.vvsu.ru");

// создание пакета для передачи команд серверу

DatagramPacket pOut=

new DatagramPacket(buf,512,serverAdd,9999);

// цикл посылки команд серверу

while(!quit)

{ // ввод строки с клавиатуры

length=System.in.read(buf);

if(length==1)

// только символ перевода строки

continue;

// ---- посылка данных

s.send(pOut); // посылка пакета

// ---- при вводе "quit" - выход

// удаление незначащих байт из массива

strFull=new StringTokenizer(new String(buf,0),"\r\n");

str=(String)strFull.nextElement();

if(str.toLowerCase().equals("quit")) quit=true;

}

s.close(); // закрытие сокета

}

catch(IOException ioe)

{ System.out.println(ioe.toString());

}

}

}

Клиенты этой клиент-серверной системы не получают никакого подтверждения в ответ на переданные ему пакеты данных. Можно изменить программу клиента, добавив такую возможность. Однако следует учесть, что так как датаграммные сокеты не гарантируют доставки пакетов, ожидание ответа может продлиться бесконечно долго.

Чтобы избежать этого, приложение должно выполнять работу с сервером в отдельной задаче, причем главная задача должна ждать ответ ограниченное время.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]