Для того чтобы различать одну машину от другой и обеспечивать соединение с нужной машиной, требуется механизм уникальной идентификации каждой машины в сети. В ранних сетях решалась задача предоставления уникальных имен машин в локальной сети. Однако Java ориентирована на весь Интернет, что требует механизма для идентификации машин со всего мира. Для достижения этой цели мы используем концепцию IP-адреса (адреса Интернета). IP-адрес существует в двух формах:
(1) Самая известная форма — это DNS (система доменных имен). Мой собственный домен — bruceeckel.com
. Предположим, что у меня есть компьютер под названием Opus в моём домене; его полное доменное имя может быть Opus.bruceeckel.com
. Это именно тот формат имени, который используется при отправке электронной почты другим людям, а также обычно интегрирован в адрес сайта World Wide Web (WWW).(2) Кроме того, можно использовать "четырехсимвольный" формат, то есть четыре группы цифр, разделённые точками, например 202.98.32.111
.
Независимо от формы, IP-адрес внутренне представляется как число из 32 бит (Примечание ①), поэтому каждая группа цифр не должна превышать значение 255. С помощью метода static InetAddress.getByName()
, предоставленного пакетом java.net
, можно создать объект Java, представляющий любой из этих форм IP-адреса. Результатом является объект типа InetAddress
, который можно использовать для создания "сокета" (Socket
), о котором вы узнаете позже.①: Это означает, что максимальное количество возможных уникальных IP-адресов составляет около 4 миллиардов, и вскоре они могут закончиться для всего мира. Однако согласно новому проекту IP-адресации, который рассматривается, будет использоваться число из 128 бит, что обеспечит уникальность IP-адресов на протяжении нескольких веков.Как пример использования InetAddress.getByName()
, рассмотрим ситуацию, когда у вас есть провайдер услуг доступа в Интернет (Интернет-провайдер), предоставляющий подключение через модем. Каждый раз, когда вы подключаетесь, вам назначается временный IP-адрес. Но во время подключения этот IP-адрес имеет ту же силу, что и любой другой IP-адрес в интернете. Если кто-то подключится к вашей машине по вашему IP-адресу, он сможет использовать ваши программы сервера Web или FTP. Однако для этого ему потребуется знать текущий IP-адрес вашего компьютера. Поскольку каждый раз при подключении вы получаете случайный IP-адрес, как узнать свой актуальный IP-адрес?
Ниже приведён программный код, который использует InetAddress.getByName()
, чтобы получить ваш IP-адрес. Чтобы запустить его, вам потребуется знать имя вашего компьютера заранее. Программа была протестирована только на Windows 95, но вы можете зайти в «Пуск» -> «Настройка» -> «Панель управления» -> «Сеть», а затем выбрать вкладку «Идентификация». В поле «Имя компьютера» будет указано имя, которое следует указывать в командной строке.```java
//: WhoAmI.java
// Определяет ваш сетевой адрес при подключении к Интернету.
package c15;
import java.net.*;
public class WhoAmI { public static void main(String[] args) throws Exception { if(args.length != 1) { System.err.println( "Использование: WhoAmI ИмяКомпьютера"); System.exit(1); } InetAddress a = InetAddress.getByName(args[0]); System.out.println(a); } } ///:~
В моём случае имя моего компьютера — это `Colossus` (от названия фильма, что значит «Гигант»). У меня есть большой жёсткий диск на этом компьютере. Поэтому, когда я подключаюсь к своему провайдеру, программа запускается следующим образом:
java whoAmI Colossus
Результат выполнения программы может выглядеть так (конечно, адрес каждый раз может отличаться):
Colossus/202.98.41.151
Если я сообщу этот адрес другому человеку, он сможет немедленно подключиться к моему личному веб-серверу, просто указав целевой адрес `http://202.98.41.151` (конечно, мне нельзя отключаться). Иногда это является удобным способом отправки информации другим людям или тестирования своего веб-сайта до официального запуска.
### 15.1.1 Сервер и клиент
Основная идея сети заключается в том, чтобы соединять две машины и позволять им общаться между собой. Как только они находят друг друга, начинается приятное двустороннее общение. Но как они могут найти друг друга? Это похоже на поиск друг друга в парке развлечений: одна машина должна остаться на месте и слушать, пока другая машина не скажет: «Эй, где ты?»Машина, которая остаётся на месте, называется сервером; машина, которая ищет другой компьютер, называется клиентом или потребителем. Различие между ними становится очевидным только тогда, когда клиент пытается подключиться к серверу. После установления связи происходит двусторонний обмен данными, и вопрос, кто именно является сервером или клиентом, уже не имеет большого значения. Основной задачей сервера является слушание запросов на установление соединения, что выполняется созданным нами специальным объектом сервера. Задачей клиента является попытка установления соединения с сервером, что осуществляется созданным нами специальным объектом клиента. Как только соединение установлено, оно мгновенно превращается в объект потока данных IO как на стороне сервера, так и на стороне клиента. После этого можно работать с соединением точно так же, как с обычным файлом — читать и записывать данные. Таким образом, после установления соединения можно использовать команды IO аналогично тому, как это было продемонстрировано в главе 10. Это одна из самых удобных особенностей Java для сетевых приложений.
### Тестирование программы без доступа к сетиПо различным причинам мы можем не иметь возможности протестировать свою программу с помощью клиентского и серверного оборудования и сети. Мы могли бы находиться в учебной среде или писать недостоверное сетевое приложение, которое нельзя запустить в реальной сети. Проектировщики IP учли эту проблему и создали специальный адрес `localhost`, который позволяет тестировать приложения в условиях отсутствия сети. В Java наиболее распространенным способом получения этого адреса является следующий код:```java
InetAddress addr = InetAddress.getByName(null);
Если в метод getByName()
передать значение null
, то он будет использовать адрес localhost
. Мы используем InetAddress
для индексации конкретной машины, и нам необходимо получить этот InetAddress
до выполнения дальнейших действий. Мы не можем изменять содержимое InetAddress
(хотя его можно вывести на экран, как показано в следующем примере). Единственный способ создания InetAddress
— использование статических методов класса InetAddress
: getByName()
, getAllByName()
или getLocalHost()
.
Для получения адреса локального хоста также можно передать ему строку "localhost"
:
InetAddress.getByName("localhost");
Или использовать зарезервированный IP-адрес (localhost
) в форме четырех цифр:
InetAddress.getByName("127.0.0.1");
Результат всех трёх методов одинаков.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )