Sdscompany.ru

Компьютерный журнал
10 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java net описание пакета

Пакет java.net

Java поддерживает семейства протоколов TCP, UDP и т.д. В составе пакета java.net имеется множество классов, связанных с сетью. Рассмотрим часть из них.

Класс InetAddress

Класс InetAddress используется для работы с числовым IP-адресом или доменным именем. Поддерживаются адреса IPv4 и IPv6.

Чтобы создать объекта класса InetAddress, следует использовать один из многих доступных методов-фабрик, например.

  • static InetAddress getLocalHost() — возвращает объект класса InetAddress, представляющий локальный хост
  • static InetAddress getByName(String host) — возвращает объект класса InetAddress хоста по указанному имени
  • static InetAddress[] getAllByName(String host) — возвращает массив объект класса InetAddress, представляющий все адреса, в которое преобразуется конкретное имя

Некоторые методы класса:

  • byte[] getAddress() — возвращает байтовый массив, представляющий IP-адрес в порядке байтов сети
  • String getHostAddress() — возвращает строку, представляющую адрес хоста, ассоциированного с объектом класса InetAddress
  • String getHostName() — возвращает строку, представляющую имя хоста, ассоциированного с объектом класса InetAddress

Также существуют два подкласса — Inet4Address и Inet6Address. В большинстве случаев вы можете использовать класс InetAddress, поскольку класс приспособлен для обоих стилей.

Класс ServerSocket

Класс ServerSocket является слушателем и ожидает подключения клиентов. Класс предназначен для серверов.

Класс Socket

Класс Socket предназначен для клиентов.

Класс URL представляет специальный интерфейс для доступа к информации по всей сети.

Класс URLConnection

Класс URLConnection предназначен для доступа к ресурсам на удалённом сервере. Установив соединение, вы можете просматривать свойства объекта.

  • int getContentLength() — возвращает размера в байтах содержимого объекта. Если размер недоступен, то возвращается -1
  • long getContentLenghLong() — возвращает размера в байтах содержимого объекта. Если размер недоступен, то возвращается -1
  • String getContentType() — возвращает тип содержимого по заголовку content-type или null
  • long getDate() — возвращает время и дату ответа в миллисекундах
  • InputStream getInputStream() — возвращает объект класса InputStream, который можно использовать для получения содержимого ресурса

Класс HttpURLConnection

Класс HttpURLConnection является подклассом класса URLConnection и обеспечивает поддержку соединений по протоколу HTTP.

Некоторые методы класса:

  • static boolean getFollowRedirects() — возвращает true, если автоматически следует перенаправление
  • String getRequestMethod() — возвращает строковое представление метода выполнения запроса. По умолчанию используется метод GET
  • int getResponseCode() — возвращает код ответа HTTP
  • String getResponseMessage() — возвращает сообщение ответа, ассоциированное с кодом ответа
  • void setRequestMethod(String method) — устанавливает метод, которым выполняются запросы HTTP. По умолчанию принят метод GET

Пакет java.net, ServerSocket

На сегодняшний день использование клиентов служб мгновенного обмена сообщениями (instant messanger) стало незаменимым средством для всех пользователей Интернета. Существует множество клиентов (Skype, WhatsApp, Viber, ICQ и т. д.), о которых каждый слышал и которые мы ежедневно используем. Все они работают по определенным правилам, т.е. реализуют определенные протоколы взаимодействия.

Наиболее распространенный протокол HTTP (Hyper Text Transfert Protocol) определяет взаимодействие двух программ, клиента и сервера, которые могут быть запущены на разных и удаленных друг от друга машинах. Клиентом является приложение, которое пользуется каким-то сервисом, предоставляемым сервером, обычно размещенном на удаленном компьютере. Клиент должен подключиться к удаленному серверу, который постоянно находится в режиме ожидания соединения. После этого они могут обмениваться информацией.

HTTP использует протокол TCP/IP. В статье рассмотриваются возможности, предоставляемые Java для работы с этим протоколом.

Распределение протоколов по уровням модели TCP/IP

Протокол HTTP располагается на прикладном уровне и использует для собственной реализации протоколы более низких уровней. Основой HTTP является протокол транспортного уровня TCP.

Согласно протоколу IP (Internet Packet), каждый узел (компьютер, switch и т.п.) в сети имеет свой IP-адрес. На данный момент интернет работает по протоколу IPv4, где IP адрес записывается 4 числами от 0 до 255 — например, 127.0.0.1. Существует и другой способ идентификации компьютеров в сети через доменное имя, которое более удобное и нагляднее идентифицирует компьютер, чем простой набор чисел (например, java-oline.ru). В Интернете существуют специальные сервера DNS (Domain Name System), которые осуществляют преобразование доменного имени в IP-адрес и наоборот.

TCP протокол базируется на IP для доставки пакетов, но добавляет два важных свойства :

  • установление соединения между приложениями;
  • использование портов, а не просто узлов.

Таким образом, для идентификации компьютера (host’a) в сети используется IP-адрес; для идентификации приложения TCP добавляет понятие порта. Порт — это целое число от 1 до 65535 указывающее, какому приложению предназначается пакет.

Java для работы в сети имеет специальный пакет java.net, содержащий класс Socket, что в переводе означает «гнездо». Ключевыми классами для реализации взаимодействия программ по протоколу TCP являются :

  • java.net.ServerSocket — класс реализует серверный сокет, который ожидает запросы, приходящие от клиентов по сети, и может отправлять ответ.
  • java.net.Socket — класс реализует клиентский сокет.

Серверный сокет ServerSocket

Для создания серверного сокета ServerSocket можно использовать один из следующих конструкторов :

Первым параметров в конструктор необходимо передать порт port, который будет привязан к серверному сокету. Если порт занят или запрещён к использованию политикой безопасности компьютера, то вызывается исключение IOException. Если значение передавамого порта равно 0, то система сама выделит номер свободного порта. Значение полученного порта можно узнать через вызов функции getLocalPort(). Несвязанный серверный сокет ServerSocket() необходимо «связывать» с IP-адресом и портом (см. ниже метод bind).

Параметр backlog устанавливает максимальное количество клиентских подключений. Если количество подключений достигло предела, то следующему клиенту в подключении будет отказано.

Для работы с IP-адресами в библиотеке Java имеется класс java.net.InetAddress, который используется в третьем конструкторе ServerSocket. С помощью InetAddress можно определить адрес IP локального узла, а также адреса удаленного узла, заданного доменным именем. Наиболее распространенные методы класса InetAddress :

При разработке сетевых приложений на начальном этапе, как правило, используют один компьютер (host). Для этого создатели протокола IP определили специальный адрес, называемый localhost — это IP-адрес «локальной заглушки (local loopback)» для работы приложений без использования сети. Общий порядок получения этого адреса в Java следующий :

Если методу getByName() передать значение null, то по умолчанию будет использоваться localhost. Cодержимым InetAddress нельзя манипулировать. Для создания InetArddress можно использовать один из перегруженных статических методов класса getByName(), getAllByName() или getLocalHost().

Методы серверного сокета

В таблице представлены наиболее часто используемые методы серверного сокета ServerSocket.

Использование API java.net

Рабочий каталог расположен в Practice .

Итак, мы собираемся написать наше первое распределенное приложение . Способ, с помощью которого мы собираемся это сделать, — самый простой. Раз нам нужно передавать данные между компонентами нашего приложения по сети, следовательно, этому нужно научиться. Первый способ, который мы используем для решения задачи, будет основываться на входящем в состав пакета java.net API . Этот пакет предоставляет возможность для реализации сетевого взаимодействия с применением одного из двух транспортных протоколов: UDP и TCP .

Архитектура протоколов TCP/IP , известная как набор протоколов TCP/IP , возникла в результате исследований в области протоколов и разработок, выполнявшейся в экспериментальной сети с коммутацией пакетов под названием ARPANET , которая была основана Управлением перспективных исследовательских программ Министерства обороны США ( DARPA )[3.26]. Этот набор протоколов состоит из большого собрания протоколов, изданных Координационным советом по сети Internet ( IAB ) в качестве стандартов для Internet .

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

Читать еще:  Как сделать игру на javascript

Ввиду этого в задаче обмена информацией выделяют пять основных относительно независимых уровней:

  • физический уровень ;
  • уровень доступа к сети (сетевой);
  • межсетевой уровень;
  • транспортный уровень ;
  • уровень приложений.

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

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

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

Независимо от природы приложений обмен данными должен быть надежным, т.е. хотелось бы иметь уверенность в том, что все данные попали к приложению-адресату и что эти данные получены в том порядке, в котором они были отправлены. Механизмы обеспечения надежности, по сути, независимы от природы приложений, таким образом, имеет смысл выделить такие механизмы в один общий уровень, совместно используемый всеми приложениями. Этот уровень называется транспортным. Чаще всего для него применяется протокол управления передачей ( Transmission Control Protocol — TCP ).

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

Итак, чтобы обмен информацией был возможен, каждый элемент системы должен иметь уникальный адрес . Фактически, нужно указать два уровня адресации. Каждый узел сети должен обладать своим уникальным глобальным сетевым адресом, это позволит доставить данные соответствующему узлу. Каждый процесс ( компонент ) на узле должен иметь адрес , который был бы уникальным в пределах этого узла, что даст возможность транспортному протоколу ( TCP ) доставить данные нужному процессу. Этот адрес — адрес процесса — в терминологии протоколов семейства TCP/IP называют портом.

Для большинства приложений, выполняющихся в рамках архитектуры протокола TCP/IP , протоколом транспортного уровня выступает TCP . Этот протокол обеспечивает надежное соединение для передачи данных от одного приложения к другому. Кроме него существует еще один широко используемый протокол транспортного уровня, входящий в набор протоколов TCP/IP : пользовательский протокол датаграмм ( User Datagram Protocol — UDP ). Протокол UDP предоставляет сервис без установления соединения, предназначенный для процедур на уровне приложения; он не гарантирует доставку, сохранение последовательности при приеме переданных пакетов или защиту от их дублирования. Он позволяет процессу отправлять сообщения другим процессам, с помощью минимального протокольного механизма. Протокол UDP выполняет крайне ограниченный набор функций, так как работает без установления соединения. По сути, он добавляет к протоколу IP некоторые возможности адресации портов.

Рассмотрим вкратце возможности, которые предоставляет нам java и ее пакет java.net .

Начнем мы с API , использующего протокол UDP . UDP является протоколом, применяющим для передачи датаграммы. Как уже говорилось, этот протокол не является надежным, поскольку сообщения, передаваемые с его помощью, могут теряться или приходить в другой последовательности, отличной от последовательности их отправки. Таким образом, для обеспечения надежной передачи необходимо организовывать надстройку над этим протоколом, обеспечивающую, например, нумерацию пакетов, повторную передачу пакетов при истечении времени ожидания и т.д. Длина одного сообщения (одной датаграммы) при использовании этого протокола ограничена 65536 байтами (причем многие реализации вообще ограничивают размер датаграммы 8К), в случае необходимости пересылки порции данных большего размера они должны быть разбиты на куски отправителем и снова собраны получателем. Передача сообщения — не блокирующая, прием — блокирующий с возможностью прерывания по истечении времени ожидания.

Для работы с UDP в пакете java.net определены следующие классы.

  • DatagramPacket ( датаграмма ). Конструктор этого класса принимает массив байт и адрес процесса-получателя ( IP -адрес узла и порт). Класс предназначен для представления единичной дата-граммы (сообщения). Этот класс используется как для создания сообщения с целью последующей его отправки, так и при приеме сообщения (функция приема возвращает экземпляр этого класса).
  • DatagramSocket.Предназначен для посылки/приема UDP -дата-грамм. Один из конструкторов принимает в качестве аргумента порт, с которым связывается сокет, другой конструктор, без аргументов, задействует в качестве порта первый попавшийся свободный порт. Класс имеет методы send и receive , для, соответственно, передачи и приема датаграмм. Метод setSoTimeout устанавливает тайм-аут для операций сокета.

Ниже приведены две простые программы, использующие рассмотренные механизмы для организации взаимодействия.

Первая программа создает сокет, соединяется с сервером (порт 6789), пересылает ему сообщение и ждет ответа (пример 3.1).

Поскольку это первые наши программы, прокомментируем их более подробно.

В первых строках (строки 1,2) происходит импорт необходимых библиотек (пакетов) классов — в нашем случае это java.net и java.io . Первый пакет содержит необходимые нам классы для работы с UDP , второй определяет необходимые классы ввода/вывода.

Наш класс (строка 3) называется UDPClient,он содержит единственный статический метод main (строка 4), являющийся точкой входа в программу . Метод принимает массив аргументов командной строки, переданных программе при запуске. В качестве аргументов для нашей программы должны быть переданы: строка сообщения (которое будет оправлено на сервер) и адрес узла, на котором запущена программа, — сервер (порт не передается, поскольку в нашем случае он заранее известен). Далее создается сокет для передачи сообщения (строка 7), затем происходит разрешение переданного в качестве аргумента командной строки имени узла сервера в адрес (строка 9). Затем создается датаграмма (строки 11-12), в конструкторе которой передается массив, составляющий передаваемые данные, адрес узла, на котором выполняется сервер и порт (который нам известен заранее). Пакет передается на сервер (строка 13). Обратите внимание — адрес получателя определяется в пакете, а не в сокете, через который мы его передаем. Т.е. один и тот же сокет может быть использован для передачи пакетов разным узлам, и этот же сокет может применяться для приема пакета от сервера (строка 17). После использования сокет должен быть закрыт (строка 20).

Другая программа (сервер) создает сокет и обслуживает запросы клиента (пример 3.2).

В том случае, когда при установке пакета jdk в системе были установлены соответствующие пути, для компиляции примера нужно выполнить следующие действия:

  • перейти в каталог, где сохранены файлы UDPClient.java и UDPServer.java ;
  • набрать в командной строке команду компиляции javac *.java .

После компиляции в текущем каталоге должны появиться два файла: UDPClient.class и UDPServer.class , которые представляют собой наши классы, откомпилированные в байт-код.

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

Читать еще:  Словарь на ошибки

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

Клиент запускается следующим образом:

Первый параметр определяет строку, которая будет передана серверу, второй — адрес узла, на котором запущен сервер. В данном случае и клиент, и сервер запущены на одной машине, поэтому в качестве адреса используется адрес 127.0.0.1 ( localhost ).

После запуска клиент отправляет строку на сервер, печатает ее в консоли и завершает работу (рис. 3.2). Сервер же продолжает ожидать очередное подключение следующего клиента (рис. 3.1).

Java net описание пакета

Эта глава посвящена описанию пакета java.net. Java поддерживает протокол TCP/IP, во-первых, расширяя свой интерфейс потоков ввода-вывода, описанного в предыдущей главе, и во вторых, добавляя возможности, необходимые для построения объектов ввода-вывода при работе в сети.

J ava поддерживает адреса абонентов, принятые в Internet, с помощью класса InetAddress. Для адресации в Internet используются служебные функции, работающие с обычными, легко запоминающимися символическими именами, эти функции преобразуют символические имена в 32-битные адреса.

В классе InetAddress нет доступных пользователю конструкторов. Для создания объектов этого класса нужно воспользоваться одним из его фабричных методов. Фабричные методы — это обычные статические методы, которые возвращают ссылку на объект класса, которому они принадлежат. В данном случае, у класса InetAddress есть три метода, которые можно использовать для создания представителей. Это методы getLocalHost, getByName и getAllByName.

В приведенном ниже примере выводятся адреса и имена локальной машины, локального почтового узла и WWW-узла компании, в которой работает автор.

InetAddress Address = InetAddress.getLocalHost();

InetAddress SW[] = InetAddress.getAllByNarne(“www.starwave.com»);

У класса InetAddress также есть несколько нестатических методов, которые можно использовать с объектами, возвращаемыми только что названными фабричными методами :

  • getHostName() возвращает строку, содержащую символическое имя узла, соответствующее хранящемуся в данном объекте адресу Internet.
  • getAddress() возвращает байтовый массив из четырех элементов, в котором в порядке, используемом в сети, записан адрес Internet, хранящийся в данном объекте.
  • toString() возвращает строку, в которой записано имя узла и его адрес.

Дейтаграммы, или пакеты протокола UDP (User Datagram Protocol) — это пакеты информации, пересылаемые в сети по принципу “fire-and-forget” (выстрелил и забыл). Если вам надо добиться оптимальной производительности, и вы в состоянии минимизировать затраты на проверку целостности информации, пакеты UDP могут оказаться весьма полезными.

UDP не предусматривает проверок и подтверждений при передаче информации. При передаче пакета UDP по какому-либо адресу нет никакой гарантии того, что он будет принят, и даже того, что по этому адресу вообще есть кому принимать такие пакеты. Аналогично, когда вы получаете дейтаграмму, у вас нет никаких гарантий, что она не была повреждена в пути или что ее отправитель все еще ждет от вас подтверждения ее получения.

Java реализует дейтаграммы на базе протокола UDP, используя для этого два класса. Объекты класса DatagramPacket представляют собой контейнеры с данными, a DatagramSocket — это механизм, используемый при передаче и получении объектов DatagramPacket.

Сокеты “для клиентов”

TCP/IP-сокеты используются для реализации надежных двунаправленных, ориентированных на работу с потоками соединений точка-точка между узлами Internet. Сокеты можно использовать для соединения системы ввода-вывода Java с программами, которые могут выполняться либо на локальной машине, либо на любом другом узле Internet. В отличие от класса DatagramSocket, объекты класса Socket реализуют высоконадежные устойчивые соединения между клиентом и сервером.

В пакете java.net классы Socket и ServerSocket сильно отличаются друг от друга. Первое отличие в том, что ServerSocket ждет, пока клиент не установит с ним соединение, в то время, как обычный Socket трактует недоступность чего-либо, с чем он хочет соединиться, как ошибку. Одновременно с созданием объекта Socket устанавливается соединение между узлами Internet. Для создания сокетов вы можете использовать два конструктора:

Socket(Strin g host, int port) устанавливает соединение между локальной машиной и указанным портом узла Internet, имя которого было передано конструктору. Этот конструктор может возбуждать исключения UnknownHostException и IOException.

Socket(InetAddress address, int port) выполняет ту же работу, что и первый конструктор, но узел, с которым требуется установить соединение, задается не строкой, а объектом InetAddress. Этот конструктор может возбуждать только IOException.

Из объекта Socket в любое время можно извлечь информацию об адресе Internet и номере порта, с которым он соединен. Для этого служат следующие методы:

  • getInetAddressQ возвращает объект InetAddress, связанный с данным объектом Socket.
  • getPort() возвращает номер порта на удаленном узле, с которым установлено соединение.
  • getLocalPort() возвращает номер локального порта, к которому присоединен данный объект.

После того, как объект Socket создан, им можно воспользоваться для того, чтобы получить доступ к связанным с ним входному и выходному потокам. Эти потоки используются для приема и передачи данных точно так же, как и обычные потоки ввода-вывода, которые мы видели в предыдущей главе:

  • getInputStream() возвращает InputStream, связанный с данным объектом.
  • getOutputStream() возвращает OutputStream, связанный с данным объектом.
  • close() закрывает входной и выходной потоки объекта Socket.

Приведенный ниже очень простой пример открывает соединение с портом 880 сервера “timehost” и выводит полученные от него данные.

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

Socket s = new Socket(«timehost.starwave.com»,880);

InputStream in = s.getInputStream();

while ((c = in.read()) != -1) <

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

Сокеты “для серверов”

Как уже упоминалось ранее, Java поддерживает сокеты серверов. Для создания серверов Internet надо использовать объекты класса ServerSocket . Когда вы создаете объект ServerSocket, он регистрирует себя в системе, говоря о том, что он готов обслуживать соединения клиентов. У этого класса есть один дополнительный метод accept(), вызов которого блокирует подпроцесс до тех пор, пока какой-нибудь клиент не установит соединение по соответствующему порту. После того, как соединение установлено, метод accept() возвращает вызвавшему его подпроцессу обычный объект Socket.

Два конструктора класса ServerSocket позволяют задать, по какому порту вы хотите соединяться с клиентами, и (необязательный параметр) как долго вы готовы ждать, пока этот порт не освободится.

ServerSocket(int port) создает сокет сервера для заданного порта.

ServerSocket(int port, int count) создает сокет сервера для заданного порта. Если этот порт занят, метод будет ждать его освобождения максимум count миллисекунд.

URL (Uniform Re source Locators — однородные указатели ресурсов) — являются наиболее фундаментальным компонентом “Всемирной паутины”. Класс URL предоставляет простой и лаконичный программный интерфейс для доступа к информации в Internet с помощью URL.

У класса URL из библиотеки Java — четыре конструктора . В наиболее часто используемой форме конструктора URL адрес ресурса задается в строке, идентичной той, которую вы используете при работе с браузером:

Две следующих разновидности конструкторов позволяют задать URL, указав его отдельные компоненты:

URL(String protocol, String host, int port, String file)

URL(String protocol, String host, String file)

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

URL(URL context, String spec)

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

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

URL hp = new URL(«http://coop.chuvashia.edu»);

System.out. println(«Protocol: » + hp.getProtocol());

Для того, чтобы извлечь реальную информацию, адресуемую данным URL, необходимо на основе URL создать объект URLConnection, воспользовавшись для этого методом openConnection().

URLConnection — объект, который мы используем либо для проверки свойств удаленного ресурса, адресуемого URL, либо для получения его содержимого. В приведенном ниже примере мы создаем URLConnection с помощью метода openConnection, вызванного с объектом URL. После этого мы используем созданный объект для получения содержимого и свойств документа.

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

URL hp = new URL(«http», «127.0.0.1», 80, «/»);

URLConnection hpCon = hp.openConnection();

System.out.println( «Last M: » + hpCon.getLastModified());

if (hpCon.getContentLength() > 0) <

InputStream input = hpCon.getInputStream();

while (((c = input. read()) != -1) && (—i > 0)) <

Java net описание пакета

Эта глава посвящена описанию пакета java.net. Java поддерживаетпротокол TCP/IP, во-первых, расширяя свой интерфейс потоков ввода-вывода,описанного в предыдущей главе, и во вторых, добавляя возможности, необходимыедля построения объектов ввода-вывода при работе в сети.

J ava поддерживаетадреса абонентов, принятые в Internet, с помощью класса InetAddress. Дляадресации в Internet используются служебные функции, работающие с обычными,легко запоминающимися символическими именами, эти функции преобразуютсимволические имена в 32-битные адреса.

В классе InetAddress нет доступных пользователю конструкторов.Для создания объектов этого класса нужно воспользоваться одним из его фабричныхметодов. Фабричные методы — это обычные статические методы, которые возвращают ссылку наобъект класса, которому они принадлежат. В данном случае, у класса InetAddressесть три метода, которые можно использовать для создания представителей. Этометоды getLocalHost, getByName и getAllByName.

В приведенном ниже примере выводятся адреса и имена локальноймашины, локального почтового узла и WWW-узла компании, в которой работаетавтор.

InetAddress Address = InetAddress.getLocalHost()-

InetAddress SW[] = InetAddress.getAllByNarne(«www.starwave.com»)-

У класса InetAddress также есть несколько нестатическихметодов, которые можно использовать с объектами, возвращаемыми только чтоназванными фабричными методами :

  • getHostName() возвращает строку, содержащую символическое имя узла,соответствующее хранящемуся в данном объекте адресу Internet.
  • getAddress() возвращает байтовый массив из четырех элементов, в котором впорядке, используемом в сети, записан адрес Internet, хранящийся в данномобъекте.
  • toString() возвращает строку, в которой записано имя узла и егоадрес.

Дейтаграммы, или пакеты протокола UDP (User Datagram Protocol)— это пакеты информации, пересылаемые в сети по принципу «fire-and-forget”(выстрелил и забыл). Если вам надо добиться оптимальной производительности, и выв состоянии минимизировать затраты на проверку целостности информации, пакетыUDP могут оказаться весьма полезными.

UDP не предусматривает проверок и подтверждений при передачеинформации. При передаче пакета UDP по какому-либо адресу нет никакой гарантиитого, что он будет принят, и даже того, что по этому адресу вообще есть комупринимать такие пакеты. Аналогично, когда вы получаете дейтаграмму, у вас нетникаких гарантий, что она не была повреждена в пути или что ее отправитель всееще ждет от вас подтверждения ее получения.

Java реализует дейтаграммы на базе протокола UDP, используя дляэтого два класса. Объекты класса DatagramPacket представляют собой контейнеры с данными, a DatagramSocket — этомеханизм, используемый при передаче и получении объектовDatagramPacket.

Сокеты «для клиентов”

TCP/IP-сокеты используются для реализации надежныхдвунаправленных, ориентированных на работу с потоками соединений точка-точкамежду узлами Internet. Сокеты можно использовать для соединения системыввода-вывода Java с программами, которые могут выполняться либо на локальноймашине, либо на любом другом узле Internet. В отличие от класса DatagramSocket,объекты класса Socket реализуют высоконадежные устойчивые соединения междуклиентом и сервером.

В пакете java.net классы Socket и ServerSocket сильноотличаются друг от друга. Первое отличие в том, что ServerSocket ждет, покаклиент не установит с ним соединение, в то время, как обычный Socket трактуетнедоступность чего-либо, с чем он хочет соединиться, как ошибку. Одновременно с созданиемобъекта Socket устанавливается соединение между узлами Internet. Для созданиясокетов вы можете использовать два конструктора:

Socket(Strin g host, int port)устанавливает соединение ме
жду локальной машиной и указанным портом узлаInternet, имя которого было передано конструктору. Этот конструктор можетвозбуждать исключения UnknownHostException и IOException.

  • Socket(InetAddress address, int port) выполняет ту же работу, что и первый конструктор,но узел, с которым требуется установить соединение, задается не строкой, аобъектом InetAddress. Этот конструктор может возбуждать только IOException.
  • Из объекта Socket в любое время можно извлечь информацию обадресе Internet и номере порта, с которым он соединен. Для этого служатследующие методы:

    • getInetAddressQ возвращает объект InetAddress, связанный с данным объектомSocket.
    • getPort() возвращает номер порта на удаленном узле, с которым установленосоединение.
    • getLocalPort() возвращает номер локального порта, к которому присоединенданный объект.

    После того, как объект Socket создан, им можно воспользоватьсядля того, чтобы получить доступ к связанным с ним входному и выходному потокам.Эти потоки используются для приема и передачи данных точно так же, как и обычныепотоки ввода-вывода, которые мы видели в предыдущей главе:

      getInputStream() возвращает InputStream, связанный с данным объектом.

  • getOutputStream() возвращает OutputStream, связанный с данным объектом.
  • close() закрывает входной и выходной потоки объектаSocket.
  • Приведенный ниже очень простой пример открывает соединение спортом 880 сервера «timehost” и выводит полученные от негоданные.

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

    Socket s = new Socket(«timehost.starwave.com»,880)-

    InputStream in = s.getInputStream()-

    while ((c = in.read()) != -1) <

    System.out.print( (char) c)-

    Сокеты «для серверов”

    Как уже упоминалось ранее, Java поддерживает сокеты серверов.Для создания серверов Internet надо использовать объекты класса ServerSocket . Когда высоздаете объект ServerSocket, он регистрирует себя в системе, говоря о том, чтоон готов обслуживать соединения клиентов. У этого класса есть одиндополнительный метод accept(), вызов которого блокирует подпроцесс до тех пор,пока какой-нибудь клиент не установит соединение по соответствующему порту.После того, как соединение установлено, метод accept() возвращает вызвавшему его подпроцессуобычный объект Socket.

    Два конструктора класса ServerSocket позволяют задать, покакому порту вы хотите соединяться с клиентами, и (необязательный параметр) какдолго вы готовы ждать, пока этот порт не освободится.

    ServerSocket(int port) создает сокет сервера для заданного порта.

  • ServerSocket(int port, int count) создает сокет сервера для заданного порта.Если этот порт занят, метод будет ждать его освобождения максимум countмиллисекунд.
  • URL (Uniform Re source Locators — однородные указатели ресурсов) —являются наиболее фундаментальным компонентом «Всемирной паутины”. Класс URLпредоставляет простой и лаконичный программный интерфейс для доступа кинформации в Internet с помощью URL.

    У класса URL из библиотеки Java — четыреконструктора . Внаиболее часто используемой форме конструктора URL адрес ресурса задается встроке, идентичной той, которую вы используете при работе сбраузером:

    Две следующих разновидности конструкторов позволяют задать URL,указав его отдельные компоненты:

    URL(String protocol, String host, int port, String file)

    URL(String protocol, String host, String file)

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

    URL(URL context, String spec)

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

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

    URL hp = new URL(«http://coop.chuvashia.edu»)-

    System.out. println(«Protocol: » + hp.getProtocol())-

    System.out.println(«File: » + hp.
    getFile())-

    Для того, чтобы извлечь реальную информацию, адресуемую даннымURL, необходимо на основе URL создать объект URLConnection, воспользовавшись дляэтого методом openConnection().

    URLConnection — объект, который мы используем либо для проверкисвойств удаленного ресурса, адресуемого URL, либо для получения его содержимого.В приведенном ниже примере мы создаем URLConnection с помощью методаopenConnection, вызванного с объектом URL. После этого мы используем созданныйобъект для получения содержимого и свойств документа.

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

    URL hp = new URL(«http», «127.0.0.1», 80, «/»)-

    URLConnection hpCon = hp.openConnection()-

    System.out.println( «Last M: » + hpCon.getLastModified())-

    if (hpCon.getContentLength() &gt- 0) <

    InputStream input = hpCon.getInputStream()-

    while (((c = input. read()) != -1) &amp-&amp- (—i &gt- 0)) <

    Ссылка на основную публикацию
    ВсеИнструменты 220 Вольт
    Adblock
    detector