Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Реализация протоколов транспортного уровня в языке JAVA

Читайте также:
  1. IV. Стратегии ценообразования в зависимости от уровня цен
  2. IV.Реализация продукции
  3. Modal Verbs and their Equivalents. Модальные глаголы и их эквиваленты в английском языке.
  4. Past Continuous – длительное прошедшее время в английском языке
  5. RAID уровня 3
  6. RAID уровня 5
  7. RAIDS Практическая реализация
  8. Rule # 1Чтобы задать вопрос в английском языке вспомогательный глагол нужно поставить на первое место
  9. Альтернативный метод расчета по корректированным подуровням звукового давления
  10. Анализ уровня рентабельности производства

Работа 3. Программирование сетевых приложений на основе модели клиент - сервер. Часть 2. Протоколы транспортного уровня.

 

Цели работы.

 

Изучить базовые протоколы транспортного уровня стека протоколов TCP/IP.

Проанализировать возможности выбора телекоммуникационных протоколов для целевых сетевых приложений с различными свойствами обработки информации.

 

Программа работы.

 

Используя исходные тексты сетевых Java - приложений (в соответствии с указаниями преподавателя), а также описания реализаций протоколов транспортного уровня (см. Приложение к настоящей работе), изучите встроенные классы для программирования сетевых приложений.

 

Для каждого типа протоколов разработайте сетевые приложения транспортного уровня на основе модели клиент-сервер, использующие следующие конфигурации:

1) N clients: 1 server;

2) 1 client: N servers.

Сравните приложения по функциональным возможностям. Результаты сравнения приведите в отчете.

 

Рекомендуется дополнительно сравнить сетевые приложения транспортного уровня на языках Java и C (см. лабораторные работы по дисциплине "Системное ПО распределенных ВС"). Оцените достоинства и недостатки обоих реализаций.

 

Приложение

 

Реализация протоколов транспортного уровня в языке JAVA

 

Протокол TCP

 

Большинство приложений Internet в качестве реализации транспортного уровня используют протокол TCP. Он обеспечивает надежную связь на основе логического соединения с непрерывным потоком данных. Эти характеристики подразумевают следующее:

q Надежный (reliable). Если сегмент TCP (TCP segment) — мельчайшая единица передачи данных ТСР — потерян или поврежден, реализация ТСР обнаружит это и повторно передаст необходимый сегмент.

q На основе логического соединения (connection-oriented). Перед началом передачи данных ТСР устанавливает с удаленной машиной соединение, обмениваясь с ней служебной информацией. Этот процесс обычно называется квитированием (handshaking). В конце соединения аналогичное завершающее квитирование разрывает связь.

q С непрерывным потоком данных (continuous-stream). ТСР обеспечивает механизм передачи, позволяющий пересылать произвольное количество байт. После установления соединения сегменты ТСР обеспечивают для уровня приложений эмуляцию непрерывного потока данных.

Нетрудно понять, почему ТСР используется большинством приложений Internet. ТСР облегчает создание сетевого приложения, освобождая разработчика от необходимости обдумывать, как разбить данные по пакетам и обеспечить коррекцию ошибок. При этом ТСР требует существенных накладных расходов, так что, возможно, некоторым программистам потребуется создать свои процедуры, более эффективно обеспечивающие надежный обмен данными в соответствии с запросами конкретных приложений. Кроме того, повторная пересылка потерянных данных может быть нежелательна для данного приложения, поскольку данные могут устареть. В таких случаях альтернативой служит протокол UDP, рассмотренный в следующем разделе.

Важным понятием, определяемым в протоколе ТСР, является порт (port). Порты разграничивают отдельные потоки информации, которые параллельно существуют на одной машине. Для приложений-серверов, ожидающих контактов со стороны клиентов ТСР, можно организовать порт, где будет создано соединение. Понятие порта тесно связано с программной абстракцией, называемой сокетом.

 

Классы сокетов ТСР в Java

 

В Java имеется два стандартных класса, которые позволяют создавать сетевые приложения на основе сокетов: java.net.Socket и java.net.ServerSocket.

Класс Socket применяется для организации обычного двустороннего обмена данными и имеет четыре конструктора:

public Socket(String host, int port)

throws UnknownHostException, IOException;

public Socket(InetAddress address, int port)

throws IOException;

public Socket(String host, int port, boolean stream)

throws IOException;

public Socket(InetAddress address, int port,

boolean stream) throws IOException;

Первый конструктор позволяет создать сокет, задав доменное имя компьютера, с которым следует установить связь (параметр типа String), и номер порта на этом компьютере. Второй создает сокет по объекту типа InetAddress. Третий и четвертый конструкторы аналогичны двум первым, но дополнительно позволяют задать булевское значение, указывающее, должен ли для реализации сокета быть применен протокол на основе потока данных (например, ТСР). По умолчанию используется ТСР, но если передано значение false, будет использован ненадежный протокол на основе дейтаграмм, например UDP.

Объект класса InetAddress содержит IP-адрес компьютера в сети. У него нет конструкторов, объявленных public, но есть ряд статических методов, которые возвращают экземпляры класса InetAddress. Таким образом, объект InetAddress можно создать путем обращения к статическому методу:

try {

InetAddress remoteOP =

InetAddress.getByName("www.microsoft.com");

InetAddress[] allRemoteIPs =

InetAddress.getAllByName("www.microsoft.com");

InetAddress myIP = InetAddress.getLocalHost();

} catch(UnknownHostException excpt) {

System.err.println("Unknown host: " + excpt);

// "Неизвестный хост"

}

Первый метод возвращает объект InetAddress, содержащий IP-адрес сервера www.microsoft.com. Второй создает массив объектов InetAddress, по одному на каждый IP-адрес, ассоциированный с www.microsoft.com. Последний метод создает InetAddress с IP-адресом локальной машины. Все они могут возбуждать исключение UnknownHostException, которое обрабатывается в приведенном примере.

Класс Socket имеет также методы, позволяющие читать и писать в него: getInputStream() и getOutputStream(), которые возвращают соответственно потоки ввода и вывода. Чтобы облегчить написание приложений, эти потоки обычно надстраиваются другим потоковым объектом, а именно DataInputStream и PrintStream соответственно. И getInputStream(), и getOutputStream() могут возбуждать исключение IOException, которое должно быть перехвачено и обработано.

try {

Socket netspace = new Socket("www.netspace.org",7);

DataInputStream input =

new DataInputStream(netspace.getInputStream());

PrintStream output =

new PrintStream(netspace.getOutputStream());

} catch(UnknownHostException expt) {

System.err.println("Unknown host: " + excpt);

// "Неизвестный хост"

System.exit(1);

} catch(IOException excpt) {

System.err.println("Failed I/O: " + excpt);

// "Ошибка ввода/вывода"

System.exit(1);

}

Теперь, чтобы послать однострочное сообщение и считать однострочный ответ, достаточно использовать надстроенный поток:

output.printIn("test");

String testResponse = inpit.readLine();

Завершив обмен данными через сокет, необходимо сперва закрыть объекты InputStream и OutputStream, а затем уже сам сокет:

output.close();

input.close();

netspace.close();

Чтобы создать сервер ТСР, необходимо уметь обращаться с классом, который позволяет привязаться к порту и ожидать подключения клиентов. При каждом подключении будет создан экземпляр класса Socket.ServerSocket имеет два конструктора:

public ServerSocket(int port) throws IOException;

public ServerSocket(int port, int count)

throws IOException;

Первый из них создает сокет, подключенный к указанному порту. По умолчанию, в очереди ожидания соединения может находиться до 50 клиентов. Второй конструктор дает возможность задать длину очереди.

После создания объета ServerSocket можно использовать метод accept() для ожидания подключения клиентов. Этот метод блокируется до момента подключения клиента, а затем возвращает объект Socket для связи с клиентом. Блокировка (blocking) — термин, означающий, что процедура входит во внутренний бесконечный цикл, который прерывается при наступлении определенного события. Поток выполнения программы не идет далее блокированной процедуры до ее завершения, т. е. до наступления этого события.

Следующий текст создает объект ServerSocket с портом 2222, ожидает подключения и затем открывает потоки, через которые будет производиться обмен данными с подключившимся клиентом.

try {

ServerSocket server = new ServerSocket(2222);

Socket clientConn = server.accept();

DataInputStream input =

new DataInputStream(clientConn.getInputStream());

PrintStream output =

new PrintStream(clientConn.getOutputStream());

} catch(IOException excpt) {

System.err.println("Failed I/O: " + excpt);

// "Ошибка ввода/вывода"

System.exit(1);

}

После завершения связи с клиентом сервер должен закрыть потоки, а затем закрыть сокет, как сказано выше.

 




Дата добавления: 2015-09-11; просмотров: 76 | Поможем написать вашу работу | Нарушение авторских прав

<== предыдущая лекция | следующая лекция ==>
Адресация в Internet.| Классы UDP в Java

lektsii.net - Лекции.Нет - 2014-2025 год. (0.011 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав