Bazaprogram.ru

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

Java net inetaddress

Библиотека примеров приложений Java

Оглавление
Работа с классом InetAddress
Работа с классом URL
Просмотр файлов сервера Web
Копирование файлов сервера Web
Контрольная сумма аплета
Потоковые сокеты — сервер
Потоковые сокеты — клиент
Общение в реальном времени
Широковещатель-
ные сообщения

Аплет и расширение сервера Web

8.1. Работа с классом InetAddress

Пример показывает способы применения класса InetAddress для просмотра адреса и доменного имени локальных, а также удаленых узлов. Удаленные узлы могут задаваться своими адресами IP или доменными адресами.

Немного теории

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

Вот прототипы наиболее интересных методов этого класса:

Заметим, что создание объекта класса InetAddress выполняется не с помощью оператора new, а с применением статических методов getLocalHost, getByName и getAllByName.

Метод getLocalHost создает объект класса InetAddress для локального узла, то есть для той рабочей станции, на которой выполняется приложение Java:

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

Если узел с указанным именем не существует, при выполнении методов getByName и getAllByName возникает исключение UnknownHostException.

Методам getByName и getAllByName можно передавать не только имя узла, такое как, например, www.sun.com, но и строку адреса IP в виде четырех десятичных чисел, разделенных точками.

Кратко рассмотрим другие методы класса InetAddress.

Метод getAddress возвращает массив из четырех байт адреса IP объекта. Байт с нулевым индексом этого массива содержит старший байт адреса IP.

Метод toString возвращает текстовую строку, которая содержит имя узла, разделитель ‘/’ и адрес IP в виде четырех десятичных чисел, разделенных точками.

С помощью метода getHostName вы можете определить имя узла, для которого был создан объект класса InetAddress.

И, наконец, метод equals предназначен для сравнения адресов IP как объектов класса InetAddress.

Описание примера

Автономное приложение, описанное в этом разделе, демонстрирует способы работы с классом InetAddress.

Получив управление, наше приложение определяет и выводит на консоль адрес локального узла, выделенное из этого адреса имя локального узла и его адрес IP:

Далее приложение запрашивает с консоли адрес удаленного узла. После его ввода на экране появляется информация, аналогичная полученной для локального узла:

Заметим, что одному доменному имени может соответствовать несколько адресов IP.

Рассмотрим исходный текст приложения.

Метод main

Для обеспечения возможности работы с сетевыми классами Java мы импортировали библиотеку классов java.net.*:

Получив управление, метод main предпринимает попытку создания объекта класса InetAddress для локального узла (то есть для узла, на котором запущено наше приложение):

Метод getLocalHost может возбуждать исключение UnknownHostException, поэтому мы предусмотрели свой обработчик.

Далее метод main вызывает метод printInetAddresssInfo, отображающий на консоли имя и адрес IP, соответствующее объекту класса InetAddress, переданному в качестве параметра:

На следующем этапе запускается цикл, в котором метод main запрашивает адреса удаленных узлов, а затем получает для них адресную информацию и выводит ее на консоль:

Чтобы завершить цикл, вместо адреса вы должны ввести строку «quit».

Внутри цикла для каждого удаленного узла мы вызываем методы getByName и getAllByName:

Первый из них возвращает один адрес IP в виде объекта класса InetAddress, а второй — массив таких объектов для всех адресов IP данного узла.

При вызове методов getByName и getAllByName возможно возникновение исключения UnknownHostException. В этом случае мы считаем что пользователь ввел неправильный адрес удаленного узла и повторяем текущую итерацию цикла для ввода нового адреса.

Далее мы выводим на консоль содержимое объекта iaRemoteAddress и массива iaRemoteAll:

Метод printInetAddresssInfo

Метод printInetAddresssInfo выводит на экран информацию, хранящуюся в объекте класса InetAddress. Ссылка на этот объект передается методу через единственный параметр.

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

Вначале мы показываем текстовое представление объекта InetAddress, удобное для отладки:

Имя узла извлекается методом getHostName:

Для отображения адреса IP в виде четырех десятичных чисел, разделенных точкой, мы вначале заполняем массив ip при помощи метода getAddress:

Далее мы выводим значения чисел на консоль:

Для преобразования отрицательных значений в положительные нам приходится выполнять логическое сложение с маской 0xff.

Сеть в Java | Установите 1 (класс Java.net.InetAddress)

Этот класс представляет IP-адрес. Он представляет собой 32-битный адрес IPv4 и 128-битный адрес IPv6. Это суперкласс классов Inet6Address и Inet4Address. Экземпляр этого класса состоит из IP-адреса и обычно имени хоста в зависимости от того, было ли выполнено разрешение имени хоста во время создания.
Рекомендуемое чтение: IP-адресация | Вступление
Для этого класса нет конструкторов, но есть статические методы, которые возвращают экземпляры класса InetAddress для общего использования.

Читать еще:  Java lang runtimeexception

Методы:

  1. getAddress (): возвращает необработанный IP-адрес этого объекта InetAddress в виде массива. Порядок, в котором байты появляются в массиве, такой же, как и в IP-адресе, т.е. getAddress [0] будет содержать байт высшего порядка.
  2. getHostAddress (): возвращает IP-адрес в текстовой форме.
  3. isAnyLocalAddress (): возвращает true, если этот адрес представляет локальный адрес.
  4. isLinkLocalAddress (): возвращает true, если этот адрес является локальным адресом ссылки.
  5. isLoopbackAddress (): возвращает true, если этот адрес является адресом обратной связи.
  6. isMCGlobal (): возвращает true, если этот многоадресный адрес имеет глобальную область видимости.
  7. isMCLinkLocal (): возвращает true, если этот многоадресный адрес имеет область действия ссылки.
  8. isMCNodeLocal (): возвращает true, если этот многоадресный адрес имеет область видимости узла.
  9. isMCOrgLocal (): возвращает true, если этот многоадресный адрес имеет область организации.
  10. isMCSiteLocal (): возвращает true, если этот многоадресный адрес имеет область сайта.
  11. isMulticastAddress (): возвращает true, если этот адрес является IP-адресом многоадресной рассылки. Адреса многоадресной рассылки имеют 1110 в качестве первых 4 бит.
  12. isSiteLocalAddress (): возвращает true, если этот адрес является локальным адресом сайта.
  13. hashCode (): возвращает хеш-код, связанный с этим объектом адреса.
  14. equals () : возвращает true, если этот IP-адрес совпадает с адресом указанного объекта. Метод equals () не учитывает имена хостов при сравнении и учитывает только связанный IP-адрес.

// Java-программа для иллюстрации
// Методы Inetaddress класса

public class inetadd

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

String url = «www.geeksforgeeks.org» ;

InetAddress ip1 = Inet4Address.getByName(url);

InetAddress ip2 = InetAddress.getByAddress(addr);

// Следующие методы проверяют свойство созданного таким образом объекта.

System.out.println( «Address : » + Arrays.toString(ip1.getAddress()));

System.out.println( «Host Address : » + ip1.getHostAddress());

System.out.println( «isAnyLocalAddress : » + ip1.isAnyLocalAddress());

System.out.println( «isLinkLocalAddress : » + ip1.isLinkLocalAddress());

System.out.println( «isLoopbackAddress : » + ip1.isLoopbackAddress());

System.out.println( «isMCGlobal : » + ip1.isMCGlobal());

System.out.println( «isMCLinkLocal : » + ip1.isMCLinkLocal());

System.out.println( «isMCNodeLocal : » + ip1.isMCNodeLocal());

System.out.println( «isMCOrgLocal : » + ip1.isMCOrgLocal());

System.out.println( «isMCSiteLocal : » + ip1.isMCSiteLocal());

System.out.println( «isMulticastAddress : » + ip1.isMulticastAddress());

System.out.println( «isSiteLocalAddress : » + ip1.isSiteLocalAddress());

System.out.println( «hashCode : » + ip1.hashCode());

System.out.println( «ip1==ip2 : » + ip1.equals(ip2));

Выход :

isReachable (): возвращает true, если этот адрес достижим. Эхо-запросы ICMP используются, если разрешение может быть предоставлено, в противном случае хост пытается установить TCP-соединение через порт 7 пункта назначения. Этот метод обычно используется в качестве предварительного условия в различных программах, чтобы избежать исключений Host Unreachable в будущем.

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

  • getHostName (): возвращает имя хоста для этого IP-адреса. Если этот объект был создан с именем хоста, чем он возвращается, в противном случае выполняется обратный поиск, чтобы вернуть настроенное системой имя хоста.
  • getCanonicalHostName (): возвращает полное доменное имя для этого объекта. Если этот объект был создан с именем хоста, чем он возвращается, в противном случае выполняется обратный поиск, чтобы вернуть настроенное системой имя хоста.
  • toString (): преобразует IP-адрес в строку. Возвращает результат в виде имени хоста / IP-адреса.
  • getByAddress (): один из статических методов для создания объекта InetAddress. Он принимает имя хоста и IP-адрес в качестве параметра. Имя хоста может быть именем машины, как в «www.geeksforgeeks.org», или его текстовым IP-адресом.

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

  • getByName (): возвращает IP-адрес указанного хоста. Если хост является буквальным IP-адресом, то проверяется только его действительность.
  • getAllByName (): возвращает массив IP-адресов для данного хоста.
  • getLoopbackAddress (): возвращает адрес обратной петли.
  • getLocalHost (): возвращает IP-адрес локального хоста.

    // Java-программа для иллюстрации
    // Методы Inetaddress класса

    public class inetadd2

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

    Пакет 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

    № п.п.НазваниеПротоколы
    5ПрикладнойHTTP, RTP, FTP, DNS
    4ТранспортныйTCP, UDP, SCTP, DCCP
    3СетевойIP. Вспомогательные протоколы, вроде ICMP и IGMP, работают поверх IP.
    4КанальныйEthernet, IEEE 802.11 Wireless Ethernet, SLIP, Token Ring, ATM и MPLS
    5ФизическийФизическая среда и принципы кодирования информации, T1, E1

    Протокол 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.

    МетодОписание
    Socket accept()Ожидание подключения клиента
    void bind(SocketAddress endpoint)Связывание ServerSocket c определенным адресом (IP-адрес и порт)
    void close()Закрытие сокета
    ServerSocketChannel getChannel()Получение объекта ServerSocketChannel, связанного с сокетом
    InetAddress getInetAddress()Получение локального адреса сокета сервера
    int getLocalPort()Получение номера порта, который серверный сокет слушает
    SocketAddress getLocalSocketAddress()Получение адреса серверного сокета в виде объекта SocketAddress
    int getReceiveBufferSize()Получение размера буфера серверного сокета
    boolean isClosed()Проверка, закрыт ли серверный сокет
    void setReceiveBufferSize(int size)Определение размера буфера серверного сокета

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

    Клиентский сокет Socket

    Коиентский сокет Socket можно создать с использованием одного из следующих конструкторов :

    В строковой константе host можно указать как IP адрес сервера, так и его DNS имя. При этом программа автоматически выберет свободный порт на локальном компьютере и свяжет его с сокетом. При этом могут быть вызваны одно из двух видов исключений, связанного с неизвестным адресом хоста (в сети компьютер не будет найден) или отсутствием связи с этим сокетом.

    Класс Socket имеет один интересный метод setSoTimeout :

    Метод setSoTimeout устанавливает время ожидания (timeout) для работы с сокетом. Если в течение этого времени никаких действий с сокетом не произведено (получение и отправка данных), то он самоликвидируется. Время задаётся в секундах, при установке timeout равным 0 сокет становится «вечным».

    Примеры использования SocketServer и Socket

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

    Листинг сервера

    Сервер создает сокет ServerSocket, открывает порт и ждет подключений клиента. После подключения клиента сервер формирует отдельный поток Thread, в который передает порядковый номер клиента и сокет Socket для обмена сообщениями с клиентом. Сам сервер продолжает ожидать подключение следующего клиента.

    Здесь следует отметить немаловажную особенность серверного приложения : оно может обслуживать сразу несколько клиентов одновременно. Теоретически, количество одновременных подключений неограниченно, но практически всё упирается в мощность компьютеров. Эта проблема конечной мощности компьютеров используется в DOS атаках на серверы: их просто закидывают таким количеством подключений, что компьютеры не справляются с нагрузкой и «падают».

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

    Листинг клиента

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

    Тестирование приложений

    Результаты тестирования серверного и клиентского приложений будут выводиться в соответствующие «консоли». После подключения клиента к серверу он может отправлять сообщения. Сервер возвращает изменное сообщение клиента. Одновременно к серверу может подключиться несколько клиентов.

    Сообщения сервера

    Сервер после старта выводит соответствующее сообщение и ждет подключений клиентов. После подкючения клиента и получения от него сообщения сервер возвращает клиенту измененную строку. При получении сообщения «quit» сеанс завершается.

    Сообщения клиента

    После подключения клиента к серверу выводится информация о сокете. Далее серверу отправляется сообщение «Привет». Сервер информирует клиента, что получил это сообщение. При отправлении текста «quit» сеанс обмена сообщениями с сервером завершается.

    Скачать примеры

    Рассмотренные на странице примеры использования ServerSocket, Socket для создания сетвых приложений в виде проекта Eclipse можно скачать здесь (24.8Кб).

  • Ссылка на основную публикацию
    Adblock
    detector