1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-thinking-in-java-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
15.1 机器的标识.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 09:15 d56454c

15.1 Уникальная идентификация машин

Для того чтобы различать одну машину от другой и обеспечивать соединение с нужной машиной, требуется механизм уникальной идентификации каждой машины в сети. В ранних сетях решалась задача предоставления уникальных имен машин в локальной сети. Однако 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");

Результат всех трёх методов одинаков.

15.1.2 Порт: уникальное место внутри машиныНекоторые случаи требуют более полной идентификации сервера, чем просто IP-адрес. Это связано с тем, что на одной физической машине может работать несколько серверных процессов. Каждый IP-адрес представляет собой машину, которая содержит "порты". При настройке клиента или сервера необходимо выбрать порт, который будет использоваться обоими сторонами для связи. Можно сравнить IP-адрес с домом, а порт — с комнатой в этом доме. Обратите внимание, что порт не является физическим местоположением на машине, а представляет собой программную абстракцию (в основном для удобства представления). Клиентское приложение знает, как использовать IP-адрес машины для подключения к ней, но как ему подключиться именно к нужному сервису? Обычно каждый порт обслуживает один тип службы, и одна машина может предоставлять множество различных служб (например, HTTP и FTP и так далее). Номер порта играет важную роль здесь, являясь необходимым вторичным способом адресации. То есть, когда мы обращаемся к определённому номеру порта, это эквивалентно запросу к связанной с этим номером порта службе. "Получение времени" — это типичный пример такой услуги. Обычно каждая служба связана с уникальным номером порта на конкретной серверной машине. Клиентское приложение должно знать заранее номер порта, используемого требуемой службой.Системные службы имеют право использовать порты с номерами от 1 до 1024, поэтому не следует использовать эти порты или любые другие известные занятые порты для своих служб. Первый пример в этой книге будет использовать порт 8080 (в честь моей первой машины, которая использовала старую 8-битную микросхему Intel 8080, работавшую под управлением операционной системы CP/M).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-thinking-in-java-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-thinking-in-java-zh.git
oschina-mirror
wizardforcel-thinking-in-java-zh
wizardforcel-thinking-in-java-zh
master