Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
orsp_1.docx
Скачиваний:
5
Добавлен:
11.05.2015
Размер:
76.67 Кб
Скачать

Несколько разделов catch

В некоторых случаях один и тот же блок программного кода может возбуждать исключения различных типов. Для того, чтобы обрабатывать подобные ситуации, Java позволяет использовать любое количество catch-разделов для try-блока. Наиболее специализированные классы исключений должны идти первыми, поскольку ни один подкласс не будет достигнут, если поставить его после суперкласса. Следующая программа перехватывает два различных типа исключений, причем за этими двумя специализированными обработчиками следует раздел catch общего назначения, перехватывающий все подклассы класса Throwable.

class MultiCatch {

public static void main(String args[]) {

try {

int a = args.length;

System.out.println("a = " + a);

int b = 42 / a;

int c[] = { 1 };

c[42] = 99;

}

catch (ArithmeticException e) {

System.out.println("div by 0: " + e);

}

catch(ArrayIndexOutOfBoundsException e) {

System.out.println("array index oob: " + e);

}

} }

Этот пример, запущенный без параметров, вызывает возбуждение исключительной ситуации деления на нуль. Если же мы зададим в командной строке один или несколько параметров, тем самым установив а в значение больше нуля, наш пример переживет оператор деления, но в следующем операторе будет возбуждено исключение выхода индекса за границы массива ArrayIndexOutOf Bounds.

Вложенные операторы try

Операторы try можно вкладывать друг в друга аналогично тому, как можно создавать вложенные области видимости переменных. Если у оператора try низкого уровня нет раздела catch, соответствующего возбужденному исключению, стек будет развернут на одну ступень выше, и в поисках подходящего обработчика будут проверены разделы catch внешнего оператора try. Вот пример, в котором два оператора try вложены друг в друга посредством вызова метода.

class MultiNest {

static void procedure() {

try {

int c[] = { 1 };

c[42] = 99;

}

catch(ArrayIndexOutOfBoundsException e) {

System.out.println("array index oob: " + e);

} }

public static void main(String args[]) {

try {

int a = args.length();

System.out.println("a = " + a);

int b = 42 / a;

procedure();

}

catch (ArithmeticException e) {

System.out.println("div by 0: " + e);

}

} }

25. Основы работы в сети. Понятие клиента и сервера.

Группа компьютеров, соединенных между собой для обмена информацией, называется компьютерной сетью. Такое объединение позволяет совместно использовать ресурсы. Распределение программных работ между несколькими машинами всегда было трудоемким, сложным и полным ошибок процессом.

Программист должен знать множество деталей о сети, протоколах, а иногда и об аппаратном обеспечении. Невозможно обойтись без знаний различных “слоёв” сетевых протоколов.

Сервер – это все то, что имеет некоторый разделяемый (коллективно используемый) ресурс.

Существуют различные типы серверов:

  • Вычислительные серверы (они обеспечивают вычислительную функцию).

  • Серверы печати (управляют совокупностью принтеров).

  • Дисковые серверы (предоставляют работающее в сети дисковое пространство).

  • Web-серверы (хранят web-страницы).

Клиент – это просто любой другой объект, который хочет получить доступ к серверу.

Различие между сервером и клиентом существенно только тогда, когда клиент пытается подключиться к серверу.

Как только они соединились, происходит процесс двустороннего общения, и неважно, кто является клиентом, а кто сервером.

Работа сервера заключается в прослушивании клиента, и это выполняется с помощью специального серверного объекта – сокета.

Сокет = IP + номер_порта.

Работа клиента заключается в том, что он пытается создать соединение с сервером.

Первым запускается сервер.

У клиента тоже есть сокет (IP-адрес + номер порта). Как только соединение установлено, оно превращается в потоковый объект ввода-вывода и его можно рассматривать как файл.

26. Адресация в Internet

Интернет — это совокупность всех сетей, которые используют протокол IP для передачи информации и соединенных друг с другом «прозрачным» образом (вне зависимости от физической среды, используемой для передачи сигналов).

Типология сетей: Звезда; Кольцо; Шина; Комбинированные топологии

Звезда:

Звезда́ — базовая топология компьютерной сети, в которой все компьютеры сети присоединены к центральному узлу (обычно коммутатор), образуя физический сегмент сети. Подобный сегмент сети может функционировать как отдельно, так и в составе сложной сетевой топологии. Весь обмен информацией идет исключительно через центральный компьютер, на который таким способом возлагается очень большая нагрузка, поэтому ничем другим, кроме сети, он заниматься не может. Как правило, именно центральный компьютер является самым мощным, и именно на него возлагаются все функции по управлению обменом.

Никакие конфликты в сети с топологией звезда в принципе не возможны, потому что управление полностью централизовано.

Кольцо:

Кольцо́ — это топология, в которой каждый компьютер соединен линиями связи только с двумя другими: от одного он только получает информацию, а другому только передает. На каждой линии связи, как и в случае звезды, работает только один передатчик и один приемник.

Шина:

Комбинированные топологии:

«Звезда-Шина» - несколько сетей с топологией звезда объединяются при помощи магистральной линейной шины.

Древовидная структура.

Пересекающиеся кольца.

27. Сетевые протоколы. Протоколы TCP/IP и UDP.

Каждый компьютер в сети TCP/IP имеет адреса трех групп.

  • Физический (MAC- адрес).

  • Сетевой (IP-адрес).

  • Символьный (DNS-имя).

Transmission Control Protocol (TCP) (протокол управления передачей) — один из основных сетевых протоколов Интернета, предназначенный для управления передачей данных в сетях и подсетях TCP/IP. Выполняет функции протокола транспортного уровня модели OSI. TCP — это транспортный механизм, предоставляющий поток данных, с предварительной установкой соединения, за счёт этого дающий уверенность в достоверности получаемых данных, осуществляет повторный запрос данных в случае потери данных и устраняет дублирование при получении двух копий одного пакета. В отличие от UDP гарантирует целостность передаваемых данных и уведомление отправителя о результатах передачи.

UDP (User Datagram Protocol — протокол пользовательских дейтаграмм) — это транспортный протокол для передачи данных в сетях IP без установления соединения. Он является одним из самых простых протоколов транспортного уровня модели OSI. В отличие от TCP, UDP не подтверждает доставку данных, не заботится о корректном порядке доставки и не делает повторов. Поэтому аббревиатуру UDP иногда расшифровывают как Unreliable Datagram Protocol (протокол ненадёжных датаграмм). Зато отсутствие соединения, дополнительного трафика и возможность широковещательных рассылок делают его удобным для применений, где малы потери, в массовых рассылках локальной подсети, в медиапротоколах и т.п.

28. Сокеты TCP/IP клиентов

Сокет в переводе означает гнездо, разъём. Это программная абстракция, используемая для представления терминалов соединений между двумя машинами. Для соединений существует сокет на каждой машине.

В Java используется 2 вида сокетов:

Серверные (ServerSocket) – это класс, используемый сервером для прослушивания входящих соединений;

Клиентские (Socket) – используются для инициирования соединений. Для работы с классами сокетов в Java необходимо подключить библиотеку import java.net.*;

Сокеты для работы в сети можно создать двух типов:

1)  потоковые для TCP-соединения. TCP могут передавать данные только между двумя приложениями, т. к. они предполагают наличие канала между этими приложениями;

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

  • Для создания сокетов серверов используется класс ServerSocket.

  • Указанный класс используется для создания серверов, которые прослушивают либо локальные, либо удаленные программы клиента, чтобы соединяться с ними на опубликованных портах.

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

  • Socket(String hostname, int port) – создает сокет, соединяющий локальную хост-машину с именованной хост-машиной и портом; может выбрасывать исключение UnknownHostException или IOException.

  • Socket(InetAddress ipAddress, int port) – создает сокет, аналогичный предыдущему, но используется уже существующий объект класса InetAddres и порт; может выбрасывать исключение IOException.

  1. Socket sock=new Socket(InetAddress.getByName("localhost"),1024);//создаем сокет клиента локально по порту 1024, как и сервер.

29. Сокеты TCP/IP серверов.

Конструкторы класса ServerSocket:

  • ServerSocket(int port) – создает сокет сервера на указанном порте с длиной очереди по умолчанию 50.

  • ServerSocket(int port, int maxQueue) – создает сокет сервера на указанном порте с максимальной длиной очереди maxQueue.

  • ServerSocket(int port, int maxQueue, InetAddress localAddress) – создает сокет сервера на указанном порте с максимальной длиной очереди maxQueue.

  • ServerSocket httpServer=new ServerSocket(port);//создание сокета сервера.

Чтобы создать дейтаграмму для отправки на удаленную машину, используется следующий конструктор:

  •  public DatagramPacket(byte[] ibuf, int length, InetAddress iaddr, int iport);

  •  Здесь ibuf − массив байт, содержащий кодированное сообщение; length − количество байт, которое должно быть помещено в пакет, что определяет размер дейтаграммы; iaddr − это экземпляр класса InetAddress, который хранит IP-адрес получателя; iport указывает номер порта, на который посылается дейтаграмма.

  • Чтобы получить дейтаграмму, необходимо использовать другой конструктор для объекта DatagramPacket, в котором будут находиться принятые данные. Прототип конструктора имеет вид.

  •  public DatagramPacket(byte[] ibuf, int length);

  •  Здесь ibuf − массив байт, куда должны быть скопированы данные из дейтаграммы, а length − количество байт, которое должно быть скопировано.

30. Основные классы и интерфейсы реализации сетевого взаимодействия.

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

уровень пользователей, обменивающихся письмами, и использующих для этой цели почтовую службу;

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

уровень транспортной сети, обеспечивающий доставку грузов по путям сообщения между населенными пунктами;

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

В случае, если не существует прямых путей сообщения между населенными пунктами, к этой схеме между уровнями почтовой службы и транспортной сети добавляется еще один уровень – уровень отделений по перевозке почты, обеспечивающих правильную перегрузку почтовых отправлений на транспортных узлах, а также выбор альтернативных путей пересылки в случае выхода из строя транспортных линий.

На практике протоколы и интерфейсы регламентируют технические требования, предъявляемые к программным и аппаратным средствам. Программные (аппаратные) модули, предназначенные для обеспечения практического взаимодействия, определяемого тем или иным протоколом (или интерфейсом), обычно называют реализацией протокола (или интерфейса). Хотя различные компоненты, относящиеся к различным уровням сетевой модели формально должны быть функционально независимыми друг от друга, при практической разработке протоколов такая независимость не всегда выдерживается. Это объясняется тем, что попытка добиться точного соответствия эталонной модели может привести к неэффективности работы программно-аппаратного обеспечения, реализующего протокол. В настоящее время наблюдается два типа отклонений, возникающих при реализации уровневого взаимодействия:

функции некоторых уровней могут объединяться одним протоколом и наоборот, – функции одного уровня могут делиться между различными протоколами;

функционирование протокола какого-либо уровня подразумевают использование только определенных протоколов нижележащего уровня.

Поэтому разработка практических методов сетевого взаимодействия, как правило, подразумевает разработку не отдельных протоколов, а целых наборов протоколов. Такие наборы обычно включают в себя протоколы, относящиеся к нескольким смежным уровням эталонной модели OSI, и называются стеками (или семействами, наборами) протоколов (protocol stack, protocol suite). Наиболее известным стеком протоколов, обеспечивающим взаимодействие в сети Интернет, является стек протоколов TCP/IP. Поскольку при реализации протоколов допускаются отклонения от эталонной модели, стеки протоколов могут предполагать собственную схему деления на уровни. В частности, стек протоколов TCP/IP разделяет весь процесс сетевого взаимодействия на четыре уровня. На предложенном ниже рисунке показано соответствие уровней модели OSI и уровней стека TCP/IP.

31. Использование ключевого слова this.

Конструкторы и методы используют ключевое слово "this" совершенно по-разному. Метод использует this чтобы получить ссылку на экземпляр класса выполняющего этот метод. Статические методы не используют ключевое слово "this",т.к. они не принадлежат экземпляру класса, поэтому this некуда ссылаться. Статические методы принадлежат классу как целому, но никак не экземпляру класса. Конструкторы используют "this" чтобы сослаться на другой конструктор в этом же классе, но с другим списком параметров. Ознакомтесь с примером:

public class Platypus {

String name;

Platypus(String input) {

name = input;

}

Platypus() {

this("John/Mary Doe");

}

public static void main(String args[]) {

Platypus p1 = new Platypus("digger");

Platypus p2 = new Platypus();

} }

В данном примере имеется два конструктора. Первый получает строку-аргумент в качестве имени экземпляра класса. Второй не получает никаких аргументов, он просто вызывает первый конструктор используя имя "John/Mary Doe" по-умолчанию. Если констурктор использует ключевое слово "this", то оно должно быть в первой строке, игнорирование этого правила приведет к ошибке компилятора.

32. Использование ключевых слов super(), super.

И методы и конструкторы используют super для ссылки на супер-класс (класс предок), но разными способами. Методы используют super для выполнения какого-либо переопредленного метода супер-класса, как показано в следующем примере:

class Mammal

void getBirthInfo() {

System.out.println("born alive.");

}

}

class Platypus extends Mammal {

void getBirthInfo() {

System.out.println("hatch from eggs");

System.out.print("a mammal normally is ");

super.getBirthInfo();

}

}

Эта программа вызывает super.getBirthInfo() переопредленный метод супер-каласса Mammal.

Конструкторы используют super чтобы вызвать конструктор супер-класса. Если конструктор использует super, то этот вызов должен быть в первой строке, иначе компилятор выдаст ошибку. Ниже приведен пример:

public class SuperClassDemo {

SuperClassDemo() {}

}

class Child extends SuperClassDemo {

Child() {

super(); }

}

В этом простом примере конструктор Child() содержит вызов super, который создает экземпляр класса SuperClassDemo, в дополнение к классу Child.

Код генерируемый компилятором

Начинающий Java программист может быть озадачен когда компилятор автоматически дополнит исходный код конструкторами. В тех случаях, когда вы пишете код класса не содержащий конструкторов, компилятор автоматически дополнит его конструктором без аргументов. Т.е. если вы напишете: public class Example {}

Компилятор автоматически дополняет код не содержащий вызовов super, добавляя вызов super с несколькими параметрами или вообще без параметров в первую строку конструктора. Таким образом, если вы напишете

public class TestConstructors {

TestConstructors() {}

}

Наблюдательный новичок может быть удивлен тому, как вышеописанная программа может вызывать конструктор предка, когда TestConstructor не наследует ни одного класса. Ответом является то, что Java наследует класс Object в том случае, когда явно не указан класс предок. Компилятор автоматически добавляет конструктор без аргументов, если явно не описан конструктор, и автоматически дополняет вызовом super без аргументов, в случае отсутствия явного вызова super. Таким образом, следующие два примера являются функционально эквивалентными:

public class Example {}

и

public class Example {

Example() {

super; }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]