Помощничек
Главная | Обратная связь


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

ЛАБОРАТОРНАЯ РАБОТА №11



 

Тема: Классы пакета java.net. Основы модели OSI. Работа с сетью.

Цель: Научиться работать с пакетом java.net.

Теоретические сведения

Классы пакета java.net.

Рассматриваемые вопросы:

11.1 Классы пакета Java.net

11.1.1 InetAddress

11.1.2 Inet4Address и Inet6Address

11.1.3 Клиентские сокеты TCP/IP

11.1.4 Класс URL

11.1.5 URLConnection

11.1.6 Класс URI

11.2 Дейтаграммы

11.3 Основы модели OSI

 

11.1 Классы пакета java.net

Java поддерживает семейства протоколов как ТСР , так и UDP. ТСР применяется для надежного потокового ввода-вывода по сети. UDP поддерживает более простую, а потому быструю модель передачи дейтраграмм от точки к точке. Классы, содержащиеся в пакете java.net, перечислены ниже.

Authenticator CacheRequest

CacheResponse ContentHandler

CookieHandler CookieManager (добавлен в Java SE 6)

DatagramPacket DatagramSocket

DatagramSocketImpl HttpCookie (добавлен в java SE 6)

HttpURLConnection IDN (добавлен в Java SE 6)

Inet4Address Inеt6Аddrеss

InetAddress InetSocketAddress

InterfaceAddress JarURLConnection

MulticastSocket NetPermission

NetworkInterface PasswordAuthentication

Proxy ProxySelector

ResponseCache SecиreCacheResponse

ServerSocket Socket

SocketAddress Socketlmpl

SocketPermission URI

URL URLClassLoader URLConnection

URLDecoder URLEncoder

URLStreamHandler

 

11.1.1 InetAddress

Класс InetAddress используется для инкапсуляции как числовorо IP-aдpeca, так и доменного имени для этоrо адреса. Вы взаимодействуете с классом, используя имя IP-хоста, что намного удобнее и понятнее, чем IP-адрес. Класс InetAddress скрывает внутри себя число. Он может работать как с адресами IPv4, так и с IPv6.

Класс InetAddress не имеет видимых конструкторов. Чтобы создать объект InetAddress, вы должны использовать один из доступных методов-фабрик. Методы-фабрики (factory method) - это просто соглашение, в соответствии с которым статические методы класса возвращают экземпляр этого класса. Это делается вместо перегрузки конструктора с различными списками параметров, когда наличие уникальных имен методов делает результат более ясным. Ниже приведены три часто используемых метода-фабрики InetAddress.

static InetAddress getLocalHost( )

throws UnknownHostException

static InetAddress getByName(String hostName)

throws UnknownHostException

static InetAddress[ ] getAllByName(String hostName)

throws UnknownHostException

Метод getLoca1Host() просто возвращает объект InetAddress, представляющий локальный хост. Метод getByName() возвращает InetAddress хоста, чье имя ему передано. Если эти методы оказываются не в состоянии получить имя хоста, они возбуждают исключение UnknownHostException.

Когда одно имя используется для представления нескольких машин в Internet - это обычное явление. В мире Web-серверов это единственный путь предоставления некоторой степени масштабируемости. Метод-фабрика getA11ByName() возвращает массив InetAddress, представляющий все адреса, в которые преобразуется конкретное имя. Он также возбуждает исключение UnknownHostException в случае, если не может преобразовать имя в хотя бы один адрес. InetAddress также включает фабричный метод getDyAddress(), который принимает IР-адрес и возвращает объект InetAddress. Причем могут использоваться как адреса IPv4, так и IPv6.

В следующем примере распечатываются адреса и имена локальной машины, а также двух широко известных Intеrnеt-сайтов.

// Демонстрация применения InetAddress.

import java.net.*;

class InetAddressTest

{

public static void main(String args[]) throws UnknownHostException

InetAddress Address = InetAddress.getLocalHost();

System.out.println(Address) ;

Address = InetAddress.getByName("osborne.com");

System.out.println(Address);

InetAddress SW [] = InetAddress. getAllByName ("www. nba. соm") ;

for (int i=0; i<SW.length; i++)

System.out.println(SW[i]);

Ниже показан вывод, сгенерированный этой программой (конечно, код, который вы увидите на своей машине, может несколько отличаться).

dеfаult/206.148.209.138

osborne.com/198.45.24.162

www.nba.com/64.5.96.214

www.nba.com/64.5.96.216

В классе InetAddress также имеется несколько других методов, которые могут быть использованы с объектами, возвращенными методами, о которых мы говорили только что. Некоторые из наиболее часто применяемых методов перечислены в табл. 11.1.

Таблица 1. Наиболее часто применяемые методы InetAddress

Метод Описание
boolean equals(Object other) Возвращает true, если объект имеет тот же адрес Internet, что и other.
byte [] getAddress () Возвращает байтовый массив, представляющий IP-адрес в порядке байт сети.
String getHostAddress() Возвращает строку, представляющую адрес хоста, ассоциированного с объектом InetAddress.
String getHostName() Возвращает строку, представляющую имя хоста, ассоциированного с объектом InetAddress.
Boolean isMulticastAddress() Возвращает true, если адрес является групповым, в противном случае возвращает false.
String toString() Возвращает строку, включающую имя хоста и IP-адрес для удобства.

 

11.1.2 Inet4Address и Inеt6Аddrеss

Начиная с версии 1.4, в java включена поддержка адресов IPv6. В связи с этим были созданы два подкласса InetAddress: Inet4Address и Inеt6Аddrеss. Inet4Address представляет традиционные адреса IPv4, а Inеt6Аddrеss инкапсулируют адреса IPv6 нового стиля. Поскольку оба они являются подклассами InetAddress, ссылки InetAddress могут указывать на них. Это единственный способ, благодаря которому удалось добавить в Java функциональность IPv6, не нарушая работы существующего кода и не добавляя большого количества новых классов. В большинстве случаев вы просто можете использовать InetAddress, работая с IР-адресами, поскольку этот класс приспособлен для обоих стилей.

 

11.1.3 Клиентские сокеты TCP/IP

В java существуют два вида сокетов ТСР. Один - для серверов, другой - для клиентов. Класс ServerSocket предназначен быть "слушателем", который ожидает подключения клиентов прежде, чем что-либо делать. То есть ServerSocket предназначен для серверов. Класс Socket предназначен для клиентов. Он разработан так, чтобы соединяться с серверными сокетами и инициировать обмен по протоколу.

В табл. 11.2 описаны два конструктора, используемые для создания клиентских сокетов.

Таблица 11.2 Конструкторы класса Socket

Конструктор Описание
Socket (String hostNaтe, int port) throws UnknownHostException, IOException Создает сокет, подключенный к именованному хосту и порту.
Socket(InetAddress ipAddress, int port) throws IOException Создает сокет, используя ранее существующий объект InetAddress и порт.

 

Socket определяет несколько методов экземпляров. Например, Socket может быть просмотрен в любое время на предмет извлечения информации об адресе и порте, ассоциированной с ним. Для этого применяются методы, перечисленные в табл. 11.3.

Метод Описание
InetAddress getInetAddress () Возвращает InetAddress, ассоциированный с объектом Socket. В случае если сокет не подключен, возвращает null.
int getport () Возвращает удаленный порт, к которому подключен вызывающий объект Socket. Если сокет не подключен, возвращает 0.
int getLocalPort () Возвращает локальный порт, к которому привязан вызывающий объект Socket. Если сокет не привязан, возвращает -1.

 

Следующая программа представляет простой пример применения Socket. Она открывает соединение с портом whois (порт 43) на сервере InterNIC, посылает сокету аргументы командной строки, а затем печатает возвращенные данные. InterNIC пытается трактовать аргумент как зарегистрированное доменное имя Internet, а затем возвращает IP-aдpec и контактную информацию для этого сайта.

// Демонстрация работы с сокетами.

import java.net.*;

import java.io.*;

c1ass Whois {

pиblic static void main(String args[]) throws Exception {

int с;

// Создает сокетное соединение с internic.net, порт 43.

Socket s = new Socket("internic.net", 43);

// Получает входной и выходной потоки.

InputStream in = s.getInputStream();

OutputStream out = s.getOutputStream();

// Конструирует строку запроса.

String str = (args .1ength == 0 ? "osborne. соm" args[0]) + "\n";

// Преобразует в байты.

byte buf[] = str.getBytes();

// Посылает запрос.

out.write(bиf);

// Читает и отображает ответ.

while ((с = in.read()) != -1)

System.out.print((char) с);

}

s.close();

Если, к примеру, вы запросите информацию об osborne.соm, то получите нечто вроде следующеrо:

Whois Server Version 1.3

Domain names in the .соm, .net, and .org domains саn now bе registered with mаnу different competing registrars. Go to http://www.internic.net for detailed information.

Domain Name: OSBORNE.COM

Registrar: NETWORK SOLUTIONS, INC.

Whois Server: whois.networksolutions.com

Referral URL: http://www.networksolutions.com

Name Server: NS1.EPPG.COM

Name Server: NS2.EPPG.COM

 

11.1.4 Класс URL

URL обеспечивает довольно четкую форму уникальной идентификации адресной информации в Web. Внутри библиотеки классов java класс URL представляет простой согласованный программный интерфейс для доступа к информации по всей сети Internet посредством использования URL.

Jаvа-класс URL имеет несколько конструкторов; каждый из них может возбуждать исключение Ma1formedURLException. Одна из часто используемых форм специфицирует URL в виде строки, идентичной тому, что вы видите в браузере:

URL(String urlSpecifier) throws MalformedURLException

Следующие две формы конструктора позволяют вам разбить URL на части компоненты:

URL(String protocolName, String hostName, int port, String path)

throws MalformedURLException

URL(String protocolName, String hostName, String path)

throws MalformedURLException

Другой часто используемый конструктор позволяет указывать существующий URL в качестве ссылочного контекста, и затем создать из этого контекста новый URL. Хотя это звучит несколько запутано, на самом деле это очень просто и удобно.

URL(URL urlObj, String urlSpecifier) throws MalformedURLException

Следующий пример создает URL страницы загрузки Osborne, а затем просматривает его свойства:

// Демонстрация применения URL.

import java.net.*;

class URLDemo {

public static void main(String args[]) throws MalformedURLException

URL hp = new URL(''http://www.osborne.com/downloads'');

Sуstеm.оut.рrintln("Протокол: "+ hp.getProtocol());

System.out. println ("Порт: " + hp. getport () ) ;

System.out.println("Xocт: " + hp.getHost());

System.out.println ("Файл: " + hp.getFile ());

System. out .println ("Целиком: " + hp. toExternalForm () ) ;

}

}

Запустив это, вы получите:

Протокол: http

Порт: -l

Хост: www.osborne

Файл: /downloads

Целиком: http://www.osborne/downloads

Обратите внимание на порт -1; это означает, что порт явно не установлен. Передав объект URL, вы можете извлечь данные, ассоциированные с ним. Чтобы получить доступ к действительным битам или информации по URL, создайте из него объект URLConnection, используя его метод openConnection() , как показано ниже:

urlc = url.openConnection()

openaConnection () имеет следующую общую форму:

URLConnection openConnection() throws IOException

Он возвращает объект URLConnection, ассоциированный с вызывающим объектом URL. Обратите внимание, что он может возбуждать исключение IOException.

 

11.1.5 URLConnection

URLConnection - это класс общего назначения, предназначенный для доступа к атрибутам удаленного ресурса. Однажды установив соединение с удаленным сервером, вы можете использовать URLConnection для просмотра свойств удаленного объекта, прежде чем транспортировать его локально. Эти атрибуты представлены в спецификации протокола http и, как таковые, имеют смысл только для объектов URL, использующих протокол http.

URLConnection определяет несколько методов. Некоторые из них перечислены в табл.11.5.

Таблица 11.5 Некоторые методы класса URLConnection

Метод Описание
Int getContentLength() Возвращает размер содержимого, ассоциированого с ресурсом. Если длина недоступна, возвращается -1.
String getContentType() Возвращает тип содержимого, найденного в ресурсе. Это значение поля заголовка content-type. Возвращает null, если тип содержимого недоступен.
long getDate () Возвращает время и дату ответа, представленное в миллисекундах, прошедших с 1 января 1970 r.
long getExpiration() Возвращает время и дату устаревания ресурса, представленное в миллисекундах, прошедших с 1 января 1970 r. Если дата устаревания недоступна, возвращается ноль.
String getHeaderField (int idx) Возвращает значение заголовочного поля по индексу idx. (Индексы полей заголовка нумеруются, начиная с 0.) Возвращает null, если значение idx превышает количество полей.
String getHeaderField(String fieldNaтe) Возвращает значение заголовочного поля, чье имя указано в fieldName. Возвращает null, если указанное поле не найдено.
String getHeaderFieldKey (int idx) Возвращает ключ заголовочного поля по индексу idx. (Индексы полей заголовка нумеруются, начиная с 0.) Возвращает null, если значение idx превышает количество полей.
Map<String, List<String>> getHeaderFields() Возвращает карту, содержащую все заголовочные поля вместе с их значениями.
long getLastModified() Возвращает время и дату последней модификации ресурса, представленные в миллисекундах, прошедших после 1 января 1970 г. Если эта информация недоступна, возвращается ноль.
InputStream getInputStream() throws IOException Возвращает InputStream, привязанный к ресурсу. Данный поток может использоваться для получения содержимого ресурса.

 

Следующий пример создает URLConnection, используя метод openConnection() объекта URL, а затем применяет его для проверки свойств и одержимого документа:

// Демонстрация применения URLConnection.

import java.net.*;

import java.io.*;

import java.util.Date;

class UCDemo

{

public static void main(String args[]) throws Exception

int с;

URL hp = new URL ("http://www.internic.net ") ;

URLConnection hpCon =hp.openConnection();

// получить дату

long d =hpCon.getDate();

if (d==0)

System.out.println ("Нет информации о дате. ");

else

Sуstеm.оut.рrintln("Дата: " + new Date(d));

// получить тип содержимого

System.out.println ("Тип содержимого: " + hpCon. getContentType () ) ;

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

d = hpCon.getExpiration();

if (d==0)

System.out.println("Heт информации о сроке действия.");

else

System.out.println("Устареет: "+ new Date(d));

// получить дату последней модификации

d = hpCon.getLastModified();

if (d==0)

System.out.println ("Нет информации о дате последней модификации.") ;

e1se

Sуstеm.оut.рrintln("Дата последней модификации: " + new Date(d));

// получить длину содержимого

int len = hpCon.getContentLength();

if (len == -1)

Sуstеm.оut.рrintln("Длина содержимого недоступна.");

else

Sуstеm.оut.рriпtlп("Длина содержимого: " + len);

if (len != 0) {

System.out.println("=== Содержимое ===");

InputStream input = hpCon.getInputStream();

int i = len;

while (( (с = input.read()) ! = -1)) { // && (--i > 0)) {

System.out.print((char) с);

}

input.close();

} else {

Sуstеm.оut.рrintln("Содержимое недоступно.");

}

}

}

Эта программа устанавливает НТТР-соединение с www.internic.net через порт 80. Затем она отображает несколько заголовочных значений и извлекает содержимое. Приведем первые строки вывода (точное их содержание будет меняться со временем):

Дата: Thu Jun 08 14:41:35 CDT 2006

Тип содержимого: text/html

Нет информации о сроке действия.

Дата последней модификации: Wed Oct 05 19:49:29 CDT 2005

Длина содержимого: 4917

=== Содержимое ===

<html>

<head>

<title>InterNIC | The Internet's Network Inforrnation Center</tit1e>

<rneta name="keywords"

Content="internic,network information, domain registration">

<style type="text/css">

<!--

р, li, td, ul { font-family: Arial, Helvetica, sans-serif}

-->

</style>

</head>

 

11.1.6 Класс URI

Относительно недавним дополнением к java стал класс URI, инкапсулирующий универсальный идентификатор ресурса (Uniform Resource Identifier - URI). URI очень похож на URL. На самом деле URL представляет собой подмножество URI. URI предоставляет стандартный способ идентификации ресурсов. URL также описывает доступ к ресурсу.

 

11.1.7 Серверные сокеты TCP/IP

Класс ServerSocket используется для создания серверов, которые прослушивают обращения как локальных, так и удаленных клиентских программ, желающих установить соединения с ними через открытые порты. ServerSocket довольно-таки сильно отличается от обычных Socket. Когда вы создаете ServerSocket, он регистрирует себя в системе в качестве заинтересованного в клиентских соединениях. Конструкторы ServerSocket отражают номер порта, через который вы хотите принимать соединения, а также - обязательно - длину очереди для данного порта. Длина очереди сообщает системе о том, сколько клиентских соединений можно удерживать, прежде чем начать просто отклонять попытки подключения. По умолчанию установлено 50. При определенных условиях конструкторы могут возбуждать исключение IOException. Конструкторы этого класса описаны в табл. 11.6.

 

Таблица 11.6 Конструкторы класса ServerSocket

Конструктор Описание
ServerSocket (int port) throws IOException Создает серверный сокет на указанном порте с длиной очереди 50.
ServerSocket (int port, int тaxQueue) throws IOException Создает серверный сокет на указанном порте с максимальной длиной очереди в maxQueue.
ServerSocket(int port, int тaxQueue, InetAddress localAddress) throws IOException Создает серверный сокет на указанном порте с максимальной длиной очереди в maxQueue. На групповом хосте localAddress указывает IP-адрес, к которому привязан сокет.

 

 

11.2 Дейтаграммы

Сетевое взаимодействие в стиле ТСР/IP подходит для большинства сетевых нужд. Оно обеспечивает сериализуемые, предсказуемые и надежные потоки пакетов данных. Тем не менее, это обходится далеко не даром. ТСР включает множество сложных алгоритмов управления потоками в нагруженных сетях, а также самые пессимистические предположения относительно утери пакетов. Это порождает в некоторой степени неэффективный способ транспортировки данных. В качестве альтернативы можно использовать дейтаграммы.

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

Java реализует дейтаграммы поверх протокола UDP, используя для этого два класса: DatagramPacket - контейнер данных, и DatagramSocket - механизм, используемый для обслуживания DatagramPacket.

 

11.3 Основы модели OSI

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

Эта проблема была рассмотрена Всемирной организацией по стандартизации (International Organization for Standardization, ISO) и было принято решение разработать модель сети, которая могла бы помочь разработчикам и производителям сетевого оборудования и программного обеспечения действовать сообща. В результате в 1984 г. была создана модель OSI – модель взаимодействия открытых систем (Open Systems Interconnected). Она состоит из семи уровней, на которые разделяется задача организации сетевого взаимодействия. Схематично они представлены в таблице 11.7.

Таблица 11.7. Уровни модели OSI.
Номер уровня Название уровня Единица информации
Layer 7 Уровень приложений Данные (data)
Layer 6 Представительский уровень Данные (data)
Layer 5 Сессионный уровень Данные (data)
Layer 4 Транспортный уровень Сегмент (segment)
Layer 3 Сетевой уровень Пакет (packet)
Layer 2 Уровень передачи данных Фрейм (frame)
Layer 1 Физический уровень Бит (bit)

 

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

Рассмотрим процесс передачи информации между двумя компьютерами. Программное обеспечение формирует сообщение на уровне 7 (приложений), состоящее из заголовка и полезных данных. В заголовке содержится служебная информация, которая необходима уровню приложений адресата для обработки пересылаемой информации (например, это может быть информация о файле, который необходимо передать, или операции, которую нужно выполнить). После того, как сообщение было сформировано, уровень приложений направляет его "вниз" на представительский уровень (layer 6). Полученное сообщение, состоящее из служебной информации уровня 7 и полезных данных, для уровня 6 представляется как одно целое (хотя уровень 6 может считывать служебную информацию уровня 7). Протокол представительского уровня выполняет необходимые действия на основании данных, полученных из заголовка уровня приложений, и добавляет заголовок своего уровня, в котором содержится информация для соответствующего (6-го) уровня адресата. Полученное в результате сообщение передается далее "вниз" сеансовому уровню, где также добавляется служебная информация. Дополненное сообщение передается на следующий транспортный уровень и т.д. на каждом последующем уровне. При этом служебная информация может добавляться не только в начало сообщения, но и в конец (например, на 3-м уровне) В итоге получается сообщение, содержащее служебную информацию всех семи уровней.

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

Далее это сообщение передается через сеть в виде битов. Бит – это минимальная порция информации, которая может принимать значение 0 или 1. Таким образом, все сообщение кодируется в виде набора нулей и единиц, например, 010110101. В простейшем случае на физическом уровне для передачи формируется электрический сигнал, состоящий из серии электрических импульсов (0 - нет сигнала, 1 - есть сигнал). Именно эта единица принята для измерения скорости передачи информации. Современные сети обычно предоставляют каналы с производительностью в десятки и сотни Кбит/с и Мбит/с.

Получатель на физическом уровне получает сообщение в виде электрического сигнала. Далее происходит процесс, обратный инкапсуляции,– декапсуляция (decapsulation). На каждом уровне происходит разбор служебной информации. После декапсуляции сообщения на первом уровне (считывания и обработки служебной информации 1-го уровня) это сообщение, содержащее служебную информацию второго уровня и данные в виде полезных данных и служебной информации вышестоящих уровней, передается на следующий уровень. На канальном (2-м) уровне снова происходит анализ системной информации и сообщение передается на следующий уровень. И так до тех пор, пока сообщение не дойдет до уровня приложений, где в виде конечных данных передается принимающему приложению.

Так как каждый уровень модели OSI стандартизирован, потребители могут использовать совместно оборудование и программное обеспечение различных производителей. В результате web-сервер под управлением операционной системы Sun Solaris может передать HTML-страницу пользователю MS Windows.

 

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.