Программирование на Java
Шрифт:
5.536 ms !H 5.993 ms !H 10.431 ms !H.
Ошибка !P означает недоступность протокола (protocol unreachable).
Route
Для просмотра и редактирования таблицы маршрутов используется утилита route. Типичный пример таблицы маршрутизации на персональном компьютере:
Для ОС Windows:
route print
В таблице маршрутизации указывается
При добавлении маршрута можно использовать следующую команду.
route ADD 157.0.0.0 MASK 255.0.0.0 157.55.80.1
157.0.0.0 – удаленная сеть, 255.0.0.0 – маска удаленной сети, 157.55.80.1 – маршрутизатор, через который доступна эта сеть. Примерно такой же синтаксис используется при удалении маршрута: route DELETE 157.0.0.0.
В ОС Solaris для просмотра таблицы маршрутизации используется немного другая команда – netstat –r.
Добавление и удаление маршрутов выполняется командой route: route add –net 157.6 157.6.1.20, где 157.6 – сокращенный адрес подсети, а 157.6.1.20 – маршрут, по которому эта сеть доступна. Также удаление маршрутов в таблице маршрутизации: route del –net 157.6.
Netstat
Утилита netstat позволяет определить, какие порты открыты и по каким портам происходит передача данных между узлами сети. Например, если запустить web-браузер и открыть для просмотра web-страницу, то, запустив netstat, можно увидеть следующую строку:
TCP mycomp:3687 www.ru:http ESTABLISHED
В проведенном примере первое значение – TCP – тип протокола (может быть TCP или UDP), далее следует имя локальной машины и локальный порт, www.ru:http – имя удаленного хоста и порта, к которому производится обращение (поскольку использовался порт по умолчанию для протокола HTTP, то отображается не его числовое значение 80, а имя протокола), ESTABLISHED – показывает, что TCP-соединение установлено.
В ОС Windows с помощью команды netstat –an можно получить список всех открытых портов (параметр –n не определяет DNS-имя, а выводит только IP-адрес). Из примера выше видно, что установленных соединений нет, а все открытые порты находятся в состоянии "прослушивания", т.е. к этому порту можно обратиться для установки соединения. TCP-порт 139 отвечает за установку Netbios-сессий (например, для передачи данных через "сетевое окружение").
В ОС Solaris для получения информации об используемых портах также применяется утилита netstat. Формат вывода практически одинаков.
Пакет java.net
Перейдем к рассмотрению средств Java для работы с сетью.
Классы, работающие с сетевыми протоколами, располагаются в пакете java.net, и простейшим из них является класс URL. С его помощью можно сконструировать uniform resource locator (URL), который имеет следующий формат:
protocol://host:port/resource
Здесь protocol –
resource – имя запрашиваемого ресурса, причем, оно может быть составным, например:
ftp://myserver.ru/pub/docs/Java/JavaCourse.txt
Затем можно воспользоваться методом openStream, который возвращает InputStream, что позволяет считать содержимое ресурса. Например, следующая программа при помощи LineNumberReader считывает первую страницу сайтаи выводит ее на консоль.
import java.io.*;
import java.net.*;
public class Net {
public static void main(String args[]) {
try {
URL url = new URL("http://www.ru");
LineNumberReader r =
new LineNumberReader(new
InputStreamReader(url.openStream));
String s = r.readLine;
while (s!=null) {
System.out.println(s);
s = r.readLine;
}
System.out.println(r.getLineNumber);
r.close;
}
catch (MalformedURLException e) {
e.printStackTrace;
}
catch (IOException e) {
e.printStackTrace;
}
}
}
Из примера мы видим, что работа с сетью, как и работа с потоками, требует дополнительной работы с исключительными ситуациями. Ошибка MalformedURLException появляется в случае, если строка c URL содержит ошибки.
Более функциональным классом является URLConnection, который можно получить с помощью метода класса URL.openConnection. У этого класса есть два метода – getInputStream (именно с его помощью работает URL.openStream ) и getOutputStream, который можно использовать для передачи данных на сервер, если он поддерживает такую операцию (многие публичные web-серверы закрыты для таких действий).
Класс URLConnection является абстрактным. Виртуальная машина предоставляет реализации этого класса для каждого протокола, например, в том же пакете java.net определен класс HttpURLConnection. Понятно, что классы URL и URLConnection предоставляют возможность работы через сеть на прикладном уровне с помощью высокоуровневых протоколов.
Пакет java.net также предоставляет доступ к протоколам более низкого уровня – TCP и UDP. Для этого сначала надо ознакомиться с классом InetAddress, который является Internet-адресом, или IP. Экземпляры этого класса создаются не с помощью конструкторов, а с помощью статических методов:
InetAddress getLocalHost
InetAddress getByName(String name)
InetAddress[] getAllByName(String name)
Первый метод возвращает IP-адрес машины, на которой исполняется Java- программа. Второй метод возвращает адрес сервера, чье имя передается в качестве параметра. Это может быть как DNS-имя, так и числовой IP, записанный в виде текста, например, "67.11.12.101". Наконец, третий метод определяет все IP-адреса указанного сервера.
Для работы с TCP-протоколом используются классы Socket и ServerSocket. Первым создается ServerSocket – сокет на стороне сервера. Его простейший конструктор имеет только один параметр – номер порта, на котором будут приниматься входящие запросы. После создания вызывается метод accept, который приостанавливает выполнение программы и ожидает, пока какой-нибудь клиент не инициирует соединение. В этом случае работа сервера возобновляется, а метод возвращает экземпляр класса Socket для взаимодействия с клиентом: