Назад
Вперед
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.
Назад Вперед |