Главная » Java, Web » Работа с сетью

0

Работа с сетевыми потоками несколько отличается от работы с потоками чтения и записи данных в файлы. Однако общие принципы остаются прежними. Сложности возникают с тем, что при работе с сетью происходит взаимодействие двух компьютеров.

При работе с сетью используется стандартный пакет Java, который называется java.net. Он включает в себя несколько классов, которые используются для работы с сетью. При этом можно воспользоваться как высокоуровневым способом взаимодействия с сетью, так и низкоуровневыми приемами создания и работы с сокетами. Сокеты предоставляют программный интерфейс, с помощью которого оказывается возможным сетевое взаимодействие между самостоятельными программами. Высокоуровневое программирование предполагает взаимодействие с ресурсами всемирной паутины WWW, при этом создаваемое приложение приобретает черты Web-браузера, основная задача которого — получение HTML-документа. Этот подход основан на использовании классов java.net.URL и java.net .URLConnect ion. Объект URL — это абстрактное представление универсального локатора ресурса (Universal Resource Locator), который представляет собой адрес HTML-документа или другого ресурса в Интернете. Объект URLConnect ion представляет собой подключение к этому ресурсу.

Кроме высокоуровневого программирования при работе с сетью разработчик имеет возможность работать с сокетами, которые общаются друг с другом, передавая информацию по протоколу TCP. Для этого в языке Java существует класс java.net.socket. Сокет используется в программе для установления связи с другой программой. Связь с использованием сокетов предполагает наличие по крайней мере двух сокетов. Сокет должен присутствовать на двух (или более) программах, которые осуществляют взаимодействие друг с другом.

Классы URL и URLConnection

Любой ресурс Интернета имеет адрес, который сокращенно называется URL. Объект класса url представляет собой такой адрес. Если мы имеем объект url, то мы можем установить связь с ресурсом по указанному адресу. Для установления связи используется объект URLConnection. URL представляет собой строку, например, http://e-oiymp.com/uri.php. Существуют также относительные адреса. Относительный адрес указывается по отношению к каталогу, который задан в качестве базового (base). Объект типа url — это не просто строка, он может быть создан на основе строкового представления URL. Объект url может также быть создан на основе другого объекта типа url, который определяет базовый url. Тогда нужно задать только простой URL. Конструкторы выглядят следующим образом:

public URL(String urlName) throws Ma1fоrmedURLException

public URL(URL context, String relativeName) throws Ma1fо rmedURLExcept ion

При задании URL может возникнуть ошибка MaiformedURLException. Это означает, что адрес указан в неверной форме. Класс MaiformedURLException является подклассом класса IOException, для него требуется обязательная обработка ошибок, поэтому конструктор следует вызывать в блоке try.. .catch. Второй конструктор особенно удобен при создании апплетов. При работе с апплетами полезен метод getDocumentBase (), который определен в классе Applet. Этот метод возвращает объект типа URL, представляющий адрес базы, то есть адрес HTML-страницы, из которой был загружен апплет. Зная этот адрес, мы можем загрузить другие страницы, расположенные по соседству с исходной страницей, например URL url = new URL(getDocumentBase(), "data.txt");

Этот конструктор создает объект URL, ссылающийся на файл data.txt, расположенный на том же компьютере и в том же каталоге, что и исходный файл (файл страницы, на которой работает апплет). Другой полезный метод — это метод getcodeBase о. С его помощью мы получаем местоположение файла класса апплета (он может располагаться в другом месте, которое не совпадает с положением страницы, использующей апплет).

После того как мы располагаем объектом типа URL, мы имеем возможность вызвать его метод openConnection о и установить с его помощью связь. Метод возвращает ссылку на объект URLConnection. Этот объект может быть в свою очередь использован для создания потока inputstream, который осуществляет чтение данных из указанного URL. Это делается при помощи метода get input st ream (), например: URL url = new URL(urlAddressString); URLConnection connection = url.openConnection(); Inputstream in = connection.getlnputStream ();

Методы openConnection() И getlnputStream() могут приводить К возникновению ошибок типа IOException. После создания потока inputstream, чтение из него производится обычным способом. В том числе можно читать с использованием других объектов, например, объекта TextReader. Конечно, чтение из потока также может приводить к появлению ошибок.

Еще один очень полезный метод класса URLConnection — это метод getcontentType (). Он возвращает строку, которая содержит информацию о типе данных, находящихся по указанному адресу. Возвращаемое значение может быть null, если тип либо неизвестен, либо тип не удалось определить. Тип данных не может быть определен до того, как будет создан поток, поэтому метод getcontentType () следуеть использовать после метода get Input St ream() . Строка, которую возвратит getContentType () — ЭТО формальное название mime-типа данных, например text/plain, text/html, image/jpeg, image/gif и т. п. Mime-тип состоит из двух частей. Общая часть, например, text или image и более детализированная часть, например, html или gif. Если нас интересуют только текстовые данные, то мы можем проверить, вернет ли метод getContentType () строку, начинающуюся словом text. Mime-типы впервые были использованы в целях идентификации частей e-mail-сообщений. Аббревиатура mime соответствует словам Multipurpose Internet Mail Extensions (многофункциональные расширения почтовых приложений). Сейчас типы mime используются довольно широко, с их помощью можно идентифицировать практически любое содержимое файла.

Рассмотрим простой пример, в котором происходит чтение данных по указанному URL. Функция открывает соединение с заданным URL, проверяет тип данных и копирует данные на экран:

static void readTextFromURL(String urlString) throws Exception { // попытка копировать текст на экран с использованием заданного // URL

URL url = new URL(urlString);

URLConnection connection = url.openConnection() ; InputStream urlData = connection.getInputStream(); // проверка типа

String contentType = connection.getContentType();

if (contentType == null || contentType.startsWith("text") == false) throw new Exception("URL does not refer to a text file.");

/*

Копирование символов потока на экран до достижения конца потока или ошибки. */

while (true) {

int data = urlData.read(); if (data < 0) breaks-

System, out. print ( (char)data);

}

}

Файл ReadURL.java (листинг 2.7) содержит программу, которая осуществляет чтение текста по заданному адресу (рис. 2.5).

Рис. 2.5. Чтение по указанному в командной строке URL

Листинг 2.7. Файл ReadURL.java

impo гt j ava.net.*; import java.io.*; public class ReadURL {

public static void main(String[] args) { if (args.length ==0) {

System.out.println("Please, specify a URL on the command line."); return;

}

try {

readTextFromURL(args[0]);

}

catch (Exception e) {

System.out.println("\n*** Sorry, an error has occurred ***\n"); System.out.println(e);

}

static void readTextFromURL(String urlString) throws Exception {

URL url = new URL(urlString);

URLConnection connection = url.openConnection(); Inputstream urlData = connection.getInputStream(); String contentType = connection.getContentType();

if (contentType == null || contentType.startsWith("text") == false) throw new Exception("URL does not refer to a text file."); while (true) {

int data = urlData.read(); if (data < 0) breaks-

System, out. print ( (char)data);

}

}

}

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии