Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Скачать 1.76 Mb.
|
ЛАБОРАТОРНАЯ РАБОТА №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 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
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 определяет несколько методов экземпляров. Например, Socket может быть просмотрен в любое время на предмет извлечения информации об адресе и порте, ассоциированной с ним. Для этого применяются методы, перечисленные в табл. 11.3.
Следующая программа представляет простой пример применения 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
Следующий пример создает 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 === Содержимое === 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
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.
Хотя сегодня существуют разнообразные модели сетей, большинство разработчиков придерживается именно этой общепризнанной схемы. Рассмотрим процесс передачи информации между двумя компьютерами. Программное обеспечение формирует сообщение на уровне 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. Индивидуальные задания Реализовать приложение эхо-клиент и приложение эхо-сервер на основе протокола TCP/IP. Реализовать приложение эхо-клиент и приложение эхо-сервер на основе протокола TCP/IP. Дополнить возвратом приложением сервером справочной информации о подключившемся клиенте. Реализовать приложение эхо-клиент и приложение эхо-сервер на основе протокола TCP/IP. Дополнить возвратом справочной информации о текущих подключенных клиентах. Реализовать многопоточный вариант приложения эхо-клиент и приложения эхо-сервер. Реализовать приложение на основе протокола TCP/IP для организации обмена сообщениями между клиентами, подключенными к серверу. Реализовать приложение на основе протокола TCP/IP для организации обмена сообщениями между клиентами, подключенными к серверу. Реализовать функции передачи содержимого файлов (без использования протокола FTP) между подключенными клиентами. Реализовать многопользовательское клиент-серверное приложение эмулирующее работу билинговой системы и обладающее следующими функциональными возможностями: - открытие счета; - внесение средств на счет; - снятие средств со счета; - контроль баланса счета. 8. Реализовать приложение эхо-клиент и приложение эхо-сервер на основе протокола UDP/IP. 9. Реализовать приложение эхо-клиент и приложение эхо-сервер на основе протокола UDP/IP. Дополнить приложение возвратом приложением сервером справочной информации о подключившемся клиенте. 10. Реализовать приложение эхо-клиент и приложение эхо-сервер на основе протокола UDP/IP. Дополнить возвратом справочной информации о текущих подключенных клиентах. 11. Реализовать приложение на основе протокола UDP/IP для организации обмена сообщениями между клиентами, подключенными к серверу. 12. Реализовать приложение на основе протокола UDP/IP для организации обмена сообщениями между клиентами, подключенными к серверу. Реализовать функции передачи содержимого файлов (без использования протокола FTP) между подключенными клиентами. 13. Реализовать многопользовательское клиент-серверное приложение, эмулирующее работу новостной системы. Приложение-клиент может вносить новость и отвечать на сообщения, опубликованные другими пользователями. Сообщения доступны для просмотра всеми пользователями и образуют древовидную структуру. 14. Реализовать распределенное клиент-серверное приложение на основе протокола TCP/IP, обладающее следующими функциональными возможностями: - приложение устанавливает соединение с сервером и начинает вносить в поток передачи данных последовательность случайных целочисленных значений. 15. Реализовать распределенное клиент-серверное приложение на основе протокола TCP/IP, обладающее следующими функциональными возможностями: - сервер считывает данные из входного потока и заносит их в некоторый буфер, проверяя на наличие вновь вносимых значений в буфер, если происходит попытка дублирования, значения отбрасываются. При достижении некоторого порогового объема буфера, данные из него дозаписываются в файл, а содержимое буфера копируется в некоторый другой буфер, а вновь принимаемые значения отыскиваются и в этом буфере. Контрольные вопросы Для чего предназначен пакет java.net? Какие существуют классы пакета java.net? Для чего используется класс InetAddress? Перечислите наиболее часто применяемые методы класса InetAddress. В связи с чем были созданы два подкласса InetAddress: Inet4Address и Inet6Address? Какие виды сокетов TCP существуют в Java? Что представляет собой класс URL? Что представляет собой класс URI? Что такое дейтаграммы? Перечислите уровни модели OSI? Рекомендуемая литература Г. Шилдт Полный справочник по Java. – М., Киев: «Вильямс», 2007 Б. Эккель Философия Java. – М., Киев: «Питер», 2009 К. С. Хорстманн Основы Java. – М.: «Вильямс», 2003 А. А. Кубенский Создание и обработка структур данных в примерах на Java. – СПб.: «БХВ – Петербург», 2001 Д. Флэнаган Java в примерах. Справочник. – СПб: «Символ – Плюс», 2003 Правила техніки безпекиПри виявленні найменших неполадок у роботі комп'ютера необхідно сповістити про це викладачеві або інженерові, що обслуговує дисплейний клас. Категорично заборонене студентові самостійно виправляти несправності в комп’ютері. При виникненні пожежної або іншої небезпеки необхідно повідомити викладачеві й організовано залишити помешкання. Суворо ЗАБОРОНЯЄТЬСЯ: · торкатися до екрана й тильного боку дисплея, проводів живлення й пристроїв заземлення, з'єднувальних кабелів; · порушувати порядок ввімкнення й вимкнення апаратних блоків, намагатись самостійно усунути виявлену несправність у роботі апаратури; · класти на апаратуру сторонні предмети; · працювати на комп'ютері у вологій одежі й з вологими руками. Під час роботи на комп’ютері НЕОБХІДНО: · суворо дотримуватись положень інструкції з експлуатації апаратури; · уважно слідкувати за справністю основних блоків і пристроїв; · працювати на клавіатурі чистими сухими руками. Вимоги до оформлення звітів.Звіт по лабораторній роботі оформляється в електронному вигляді індивідуально кожним студентом. Титульний аркуш звіту повинен містити фразу: "Звіт з лабораторної роботи (назва роботи) студента групи (номер групи) (Прізвище, ініціали)". Внизу аркуша слід вказати поточний рік. Друга сторінка тексту, наступна за титульним аркушем, повинна починатися з формулювання мети роботи. Звіт повинен містити наступні основні розділи: 1. Теоретична частина (короткий виклад). 2. Докладні відповіді на питання, наведені в описі роботи. 3. Опис поетапного виконання індивідуального завдання. При здачі звіту викладач може зробити усні та письмові зауваження, задати додаткові запитання. Обсяг звіту повинен бути оптимальним для розуміння того, що і як зробив студент, виконуючи роботу. Обов'язкові вимоги до звіту включають загальну і спеціальну грамотність викладу, а також акуратність оформлення. Після прийому викладачем звіт зберігається на відповідній кафедрі і студенту не видається. Після захисту роботи викладач повідомляє студенту про результат - зарахована робота або потребує доопрацювання. |