Меню сайта

Урок 14. Сетевые средства в Java

Эта глава посвящена описанию пакета java.net. Java поддерживаетпротокол TCP/IP, во-первых, расширяя свой интерфейс потоков ввода-вывода,описанного в предыдущей главе, и во вторых, добавляя возможности, необходимыедля построения объектов ввода-вывода при работе в сети.

InetAddress

Java поддерживаетадреса абонентов, принятые в Internet, с помощью класса InetAddress. Дляадресации в Internet используются служебные функции, работающие с обычными,легко запоминающимися символическими именами, эти функции преобразуютсимволические имена в 32-битные адреса.

Фабричные методы

В классе InetAddress нет доступных пользователю конструкторов.Для создания объектов этого класса нужно воспользоваться одним из его фабричныхметодов. Фабричные методы — это обычные статические методы, которые возвращают ссылку наобъект класса, которому они принадлежат. В данном случае, у класса InetAddressесть три метода, которые можно использовать для создания представителей. Этометоды getLocalHost, getByName и getAllByName.

В приведенном ниже примере выводятся адреса и имена локальноймашины, локального почтового узла и WWW-узла компании, в которой работаетавтор.

InetAddress Address = InetAddress.getLocalHost()-

System.out.println(Address)-

Address = InetAddress.getByName(«mailhost»)-

System.out.println(Address)-

InetAddress SW[] = InetAddress.getAllByNarne(«www.starwave.com»)-

System.out.println(SW)-

У класса InetAddress также есть несколько нестатическихметодов, которые можно использовать с объектами, возвращаемыми только чтоназванными фабричными методами:

  • getHostName() возвращает строку, содержащую символическое имя узла,соответствующее хранящемуся в данном объекте адресу Internet.
  • getAddress() возвращает байтовый массив из четырех элементов, в котором впорядке, используемом в сети, записан адрес Internet, хранящийся в данномобъекте.
  • toString() возвращает строку, в которой записано имя узла и егоадрес.

Дейтаграммы

Дейтаграммы, или пакеты протокола UDP (User Datagram Protocol)— это пакеты информации, пересылаемые в сети по принципу «fire-and-forget”(выстрелил и забыл). Если вам надо добиться оптимальной производительности, и выв состоянии минимизировать затраты на проверку целостности информации, пакетыUDP могут оказаться весьма полезными.

UDP не предусматривает проверок и подтверждений при передачеинформации. При передаче пакета UDP по какому-либо адресу нет никакой гарантиитого, что он будет принят, и даже того, что по этому адресу вообще есть комупринимать такие пакеты. Аналогично, когда вы получаете дейтаграмму, у вас нетникаких гарантий, что она не была повреждена в пути или что ее отправитель всееще ждет от вас подтверждения ее получения.

Java реализует дейтаграммы на базе протокола UDP, используя дляэтого два класса. Объекты класса DatagramPacketпредставляют собой контейнеры с данными, a DatagramSocket — этомеханизм, используемый при передаче и получении объектовDatagramPacket.

Сокеты «для клиентов”

TCP/IP-сокеты используются для реализации надежныхдвунаправленных, ориентированных на работу с потоками соединений точка-точкамежду узлами Internet. Сокеты можно использовать для соединения системыввода-вывода Java с программами, которые могут выполняться либо на локальноймашине, либо на любом другом узле Internet. В отличие от класса DatagramSocket,объекты класса Socket реализуют высоконадежные устойчивые соединения междуклиентом и сервером.

В пакете java.net классы Socket и ServerSocket сильноотличаются друг от друга. Первое отличие в том, что ServerSocket ждет, покаклиент не установит с ним соединение, в то время, как обычный Socket трактуетнедоступность чего-либо, с чем он хочет соединиться, как ошибку. Одновременно с созданиемобъекта Socket устанавливается соединение между узлами Internet. Для созданиясокетов вы можете использовать два конструктора:

  • Socket(String host, int port)устанавливает соединение ме
    жду локальной машиной и указанным портом узлаInternet, имя которого было передано конструктору. Этот конструктор можетвозбуждать исключения UnknownHostException и IOException.

  • Socket(InetAddress address, int port) выполняет ту же работу, что и первый конструктор,но узел, с которым требуется установить соединение, задается не строкой, аобъектом InetAddress. Этот конструктор может возбуждать только IOException.

Из объекта Socket в любое время можно извлечь информацию обадресе Internet и номере порта, с которым он соединен. Для этого служатследующие методы:

  • getInetAddressQ возвращает объект InetAddress, связанный с данным объектомSocket.
  • getPort() возвращает номер порта на удаленном узле, с которым установленосоединение.
  • getLocalPort() возвращает номер локального порта, к которому присоединенданный объект.

После того, как объект Socket создан, им можно воспользоватьсядля того, чтобы получить доступ к связанным с ним входному и выходному потокам.Эти потоки используются для приема и передачи данных точно так же, как и обычныепотоки ввода-вывода, которые мы видели в предыдущей главе:

  • getInputStream() возвращает InputStream, связанный с данным объектом.
  • getOutputStream() возвращает OutputStream, связанный с данным объектом.
  • close() закрывает входной и выходной потоки объектаSocket.

Приведенный ниже очень простой пример открывает соединение спортом 880 сервера «timehost” и выводит полученные от негоданные.

import java.net.*-

import java.io.*-

class TimeHost {

public static void main(String args[]) throws Exception {

int c-

Socket s = new Socket(«timehost.starwave.com»,880)-

InputStream in = s.getInputStream()-

while ((c = in.read()) != -1) {

System.out.print( (char) c)-

}

s.close()-

} }

Сокеты «для серверов”

Как уже упоминалось ранее, Java поддерживает сокеты серверов.Для создания серверов Internet надо использовать объекты класса ServerSocket. Когда высоздаете объект ServerSocket, он регистрирует себя в системе, говоря о том, чтоон готов обслуживать соединения клиентов. У этого класса есть одиндополнительный метод accept(), вызов которого блокирует подпроцесс до тех пор,пока какой-нибудь клиент не установит соединение по соответствующему порту.После того, как соединение установлено, метод accept() возвращает вызвавшему его подпроцессуобычный объект Socket.

Два конструктора класса ServerSocket позволяют задать, покакому порту вы хотите соединяться с клиентами, и (необязательный параметр) какдолго вы готовы ждать, пока этот порт не освободится.

  • ServerSocket(int port) создает сокет сервера для заданного порта.

  • ServerSocket(int port, int count) создает сокет сервера для заданного порта.Если этот порт занят, метод будет ждать его освобождения максимум countмиллисекунд.

URL

URL (Uniform Resource Locators — однородные указатели ресурсов) —являются наиболее фундаментальным компонентом «Всемирной паутины”. Класс URLпредоставляет простой и лаконичный программный интерфейс для доступа кинформации в Internet с помощью URL.

У класса URL из библиотеки Java четыреконструктора. Внаиболее часто используемой форме конструктора URL адрес ресурса задается встроке, идентичной той, которую вы используете при работе сбраузером:

URL(String spec)

Две следующих разновидности конструкторов позволяют задать URL,указав его отдельные компоненты:

URL(String protocol, String host, int port, String file)

URL(String protocol, String host, String file)

Четвертая, и последняя форма конструктора позволяетиспользовать существующий URL в качестве ссылочного контекста, и создать наоснове этого контекста новый URL.

URL(URL context, String spec)

В приведенном ниже примере создается URL, адресующийwww-страницу (поставьте туда свой адрес), после чего программа печатает свойстваэтого объекта.

import java.net.URL-

class myURL {

public static void main(String args[]) throws Exception {

URL hp = new URL(«http://coop.chuvashia.edu»)-

System.out. println(«Protocol: » + hp.getProtocol())-

System.out.printin(«Port: » + hp.getPort())-

System.out.println(«Host: » + hp.getHost())-

System.out.println(«File: » + hp.
getFile())-

System.out.println(«Ext: » + hp.toExternaLForm())-

} }

Для того, чтобы извлечь реальную информацию, адресуемую даннымURL, необходимо на основе URL создать объект URLConnection, воспользовавшись дляэтого методом openConnection().

URLConnection

URLConnection — объект, который мы используем либо для проверкисвойств удаленного ресурса, адресуемого URL, либо для получения его содержимого.В приведенном ниже примере мы создаем URLConnection с помощью методаopenConnection, вызванного с объектом URL. После этого мы используем созданныйобъект для получения содержимого и свойств документа.

import java.net.*-

import java.io.*-

class localURL {

public static void main(String args[]) throws Exception {

int c-

URL hp = new URL(«http», «127.0.0.1», 80, «/»)-

URLConnection hpCon = hp.openConnection()-

System.out.println(«Date: » + hpCon.getDate())-

System.out.println(«Type: » + hpCon.getContentType())-

System.out.println(«Exp: » + hpCon.getExpiration())-

System.out.println( «Last M: » + hpCon.getLastModified())-

System.out.println(«Length: » + hpCon.getContentLength())-

if (hpCon.getContentLength() &gt- 0) {

System.out.println(«=== Content ===»)-

InputStream input = hpCon.getInputStream()-

int i=hpCon.getContentLength()-

while (((c = input. read()) != -1) &amp-&amp- (—i &gt- 0)) {

System.out.print((char) c)-

}

input.close()-

}

else {

System.out.println(«No Content Available»)-

}

} }

Эта программа устанавливает HTTP-соединение с локальным узломпо порту 80 (у вас на машине должен быть установлен Web-сервер) и запрашиваетдокумент по умолчанию, обычно это index.html. После этого программа выводит значениязаголовка, запрашивает и выводит содержимое документа.

Сеть и только сеть

Сетевые классы Java предоставляют ясный и простой виспользовании интерфейс для работы в Internet. Фундамент, заложенный в пакетеjava.net хорошая база для дальнейшего развития, которая позволит Java эволюционироватьвместе с Internet.

Категория: Обучение Java | Дата: 21.04.13

Меню раздела
Блок