Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

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

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

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

Назад Вперед

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

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

Исходный текст примера

Архив проекта для Java WorkShop 2.0

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

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

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

public static  InetAddress getLocalHost();
public static  InetAddress
  getByName(String host);
public static  InetAddress[]
  getAllByName(String host);
public byte[]  getAddress();
public String  toString();
public String  getHostName();
public boolean equals(Object obj);

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

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

InetAddress iaLocal;
iaLocal = InetAddress.getLocalHost();

В том случае, если вас интересует удаленный узел сети, вы можете создать для него объект класса 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:

------------------------
Local host address
------------------------
Address: frolov/154.100.101.11
Host name: frolov
IP Address: 154.100.101.11
Enter address ('quit' to exit):

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

------------------------
Remote host address
------------------------
Address: sampler/154.100.100.20
Host name: sampler
IP Address: 154.100.100.20
------------------------
All remote host addresses
------------------------
Address: sampler /154.100.100.20
Host name: sampler
IP Address: 154.100.100.20
Enter address ('quit' to exit):

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

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

Метод main

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

import java.net.*;
import java.util.*;

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

InetAddress iaLocalAddress = null;
try
{
  iaLocalAddress = 
    InetAddress.getLocalHost();
}
catch(UnknownHostException ex)
{
  System.out.println(ex.toString()); 
}

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

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

printInetAddresssInfo(iaLocalAddress);

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

String s;
 
while(true)
{    
  System.out.println(
    "Enter address ('quit' to exit): ");
        
  s = new String(getKbdString());
  if(s.equals("quit"))
    break;
  . . .
}

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

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

InetAddress iaRemoteAddress = null;
InetAddress[] iaRemoteAll;
      
try
{
  iaRemoteAddress = 
    InetAddress.getByName(s);
          
  iaRemoteAll = 
    InetAddress.getAllByName(s);
}
catch(UnknownHostException ex)
{
  System.out.println(ex.toString());
  continue;
}

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

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

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

printInetAddresssInfo(iaRemoteAddress);
      
for(int i = 0;i < iaRemoteAll.length; i++)
{
  printInetAddresssInfo(iaRemoteAll[i]);
}

Метод printInetAddresssInfo

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

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

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

System.out.println("Address: " + ia);

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

System.out.println("Host name: " +
  ia.getHostName());

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

byte[] ip = new byte[4];
ip = ia.getAddress();

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

System.out.println("IP Address: " + 
  (0xff & (int)ip[0]) + "." + 
  (0xff & (int)ip[1]) + "." +
  (0xff & (int)ip[2]) + "." + 
  (0xff & (int)ip[3]));

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


Назад Вперед

[Назад]