Основы создания сетевых приложений

Содержание

Слайд 2

План лекции Протоколы транспортного уровня Сокеты Использование сокетов на Java Класс URL и его использование

План лекции

Протоколы транспортного уровня
Сокеты
Использование сокетов на Java
Класс URL и его использование

Слайд 3

Модель OSI Уровень приложений (layer 7, data) Уровень представления (layer 6,

Модель OSI

Уровень приложений (layer 7, data)
Уровень представления (layer 6, data)
Сеансовый уровень (layer 5, data)
Транспортный

уровень (layer 4, segment)
Сетевой уровень (layer 3, packet)
Уровень соединения (layer 2, frame)
Физический уровень (layer 1, bit)
Слайд 4

Инкапсуляция пакета

Инкапсуляция пакета

Слайд 5

Передача сообщения по сети Сообщение состоит из заголовка и данных Для

Передача сообщения по сети

Сообщение состоит из заголовка и данных
Для каждого следующего

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

Transmission Control Protocol TCP – основанный на соединениях протокол, обеспечивающий надежную

Transmission Control Protocol
TCP – основанный на соединениях протокол, обеспечивающий надежную передачу

данных между двумя компьютерами, с сохранением порядка следования данных
Используется в: HTTP, FTP, Telnet и др.
Слайд 7

User Datagram Protocol UDP – не основанный на соединениях протокол, реализующий

User Datagram Protocol
UDP – не основанный на соединениях протокол, реализующий пересылку

независимых пакетов данных, называемых дейтаграммами, от одного компьютера к другому без гарантии их доставки
Слайд 8

Основные характеристики TCP и UDP

Основные характеристики TCP и UDP

Слайд 9

Модель «Клиент-сервер» Порядок работы Каждая из сторон виртуального соединения называется «сокет»

Модель «Клиент-сервер»

Порядок работы
Каждая из сторон виртуального соединения называется «сокет» (socket)
Приложение-сервер инициализируется

при запуске и далее бездействует, ожидая поступления запроса от клиента
Процесс-клиент посылает запрос на установление соединения с сервером, требуя выполнить для него определенную функцию
Виды приложений-серверов
Сервер последовательной обработки запросов
Сервер параллельной обработки запросов
Слайд 10

Понятие порта Компьютер (обычно) имеет только одно физическое соединение с сетью

Понятие порта

Компьютер (обычно) имеет только одно физическое соединение с сетью
Соединение описывается,

например, IP-адресом (32 бита на нынешний момент)
Как различать информацию для различных приложений?
Слайд 11

Понятие порта Сокет привязывается к порту Порт описывается 16-битным числом Порты 0-1023 зарезервированы

Понятие порта

Сокет привязывается к порту
Порт описывается 16-битным числом
Порты 0-1023 зарезервированы

Слайд 12

Интерфейс сокетов В 80-ых годах американское правительственное агентство по поддержке исследовательских

Интерфейс сокетов

В 80-ых годах американское правительственное агентство по поддержке исследовательских проектов

(ARPA), финансировало реализацию протоколов TCP/IP для UNIX в Калифорнийском университете в г. Беркли
Разработан интерфейс прикладного программирования для сетевых приложений TCP/IP (TCP/IP API)
TCP/IP sockets или Berkeley sockets
Слайд 13

Связь с файловой системой Интерфейс сокетов – через системные вызовы UNIX

Связь с файловой системой

Интерфейс сокетов – через системные вызовы UNIX
Системные вызовы

ввода-вывода UNIX выглядят как последовательный цикл:
открыть
считать/записать
закрыть
Нет различий между файлами и внешними устройствами
Слайд 14

Проблемы сетевого ввода/вывода Модель клиент-сервер не соответствует системе ввода-вывода UNIX Не

Проблемы сетевого ввода/вывода

Модель клиент-сервер не соответствует системе ввода-вывода UNIX
Не умеют устанавливать

соединения
Используется фиксированный адрес файла
Соединение с файлом доступно на протяжении всего цикла запись-считывание
Для не ориентированных на соединение протоколов фиксированный адрес – проблема: при передаче дейтаграммы адрес есть, а соединения нет
Слайд 15

Абстракция сокета Сетевое соединение – это процесс передачи данных по сети

Абстракция сокета

Сетевое соединение – это процесс передачи данных по сети между

двумя компьютерами или процессами
Сокет – конечный пункт передачи данных
Для программ сокет – одно из окончаний сетевого соединения
Для установления соединения каждая из сетевых программ должна иметь свой собственный сокет
Слайд 16

Абстракция сокета Связь между двумя сокетами может быть ориентированной на соединение

Абстракция сокета

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

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

Абстракция сокета

Абстракция сокета

Слайд 18

А что же на Java? Сокеты инкапсулированы в экземпляры специальных классов

А что же на Java?

Сокеты инкапсулированы в экземпляры специальных классов
Все низкоуровневое

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

Пакет java.net Адресация Установление TCP-соединения Передача/прием дейтаграмм через UDP Обнаружение/идентификация сетевых

Пакет java.net

Адресация
Установление TCP-соединения
Передача/прием дейтаграмм через UDP
Обнаружение/идентификация сетевых ресурсов
Безопасность: авторизация / права

доступа
Слайд 20

Адресация IP-адресация Адрес сокета

Адресация

IP-адресация
Адрес сокета

Слайд 21

Методы класса InetAddress public static InetAddress getLocalHost(); создает объект класса для

Методы класса InetAddress

public static InetAddress getLocalHost(); создает объект класса для текущего локального

узла
public static InetAddress getByName(String host); создает объект адреса по имени удаленного узла сети
public static InetAddress[] getAllByName(String h); возвращает массив адресов, связанных с узлом сети
public byte[] getAddress(); возвращает массив из четырех байт IP-адреса объекта
public String getHostName(); определение имени узла данного объекта адреса
Слайд 22

Общая схема соединения

Общая схема соединения

Слайд 23

Класс Socket Реализует клиентский сокет и его функции Конструкторы Socket() Socket(InetAddress

Класс Socket

Реализует клиентский сокет и его функции
Конструкторы
Socket()
Socket(InetAddress address, int port)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
Socket(String host,

int port)
Socket(String host, int port, InetAddress localAddr, int localPort)
Методы
void close()
InetAddress getLocalAddress()
InputStream getInputStream()
OutputStream getOutputStream()
static void setSocketImplFactory(SocketImplFactory fac)
И прочие…
Слайд 24

Порядок работы с клиентским сокетом Открытие сокета Открытие потока ввода и/или

Порядок работы с клиентским сокетом

Открытие сокета
Открытие потока ввода и/или потока вывода

для сокета
Чтение и запись в потоки согласно установленному протоколу общения с сервером
Закрытие потоков ввода-вывода
Закрытие сокета
Слайд 25

Пример клиента public class EchoClient { public static void main(String[] args)

Пример клиента

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

IOException {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket("taranis", 7);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for connection to taranis.");
System.exit(1);
}
...
Слайд 26

Пример клиента ... BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); String userInput;

Пример клиента

...
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;

while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}
Слайд 27

Класс ServerSocket Реализует серверный сокет и его функции Конструкторы ServerSocket() ServerSocket(int

Класс ServerSocket

Реализует серверный сокет и его функции
Конструкторы
ServerSocket()
ServerSocket(int port)
ServerSocket(int port, int

backlog)
Методы
void close()
Socket accept()
void bind(SocketAddress endpoint)
И прочие…
Слайд 28

Создание серверного сокета try { serverSocket = new ServerSocket(4444); } catch

Создание серверного сокета

try {
serverSocket = new ServerSocket(4444);
} catch (IOException e)

{
System.out.println(
"Could not listen on port: 4444");
System.exit(-1);
}

Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
}

Слайд 29

Сервер параллельной обработки запросов Стадия 1 Установление соединения клиент-сервер Стадия 2

Сервер параллельной обработки запросов

Стадия 1 Установление соединения клиент-сервер
Стадия 2 Сервер параллельной обработки передает

управление дочернему процессу
Стадия 3 Если во время обработки запроса поступает запрос от другого клиента, сервер параллельной обработки передает управление новому дочернему процессу
Слайд 30

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

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

(порядок) доставки и содержимое не гарантируются
Могут использоваться как для адресной, так и для широковещательной рассылки
Слайд 31

Класс DatagramPacket Экземпляры класса являются прототипами дейтаграмм-сообщений Конструкторы DatagramPacket(byte[] buf, int

Класс DatagramPacket

Экземпляры класса являются прототипами дейтаграмм-сообщений
Конструкторы
DatagramPacket(byte[] buf, int offset, int length,

InetAddress address, int port)
И прочие…
Методы
byte[] getData()
int getLength()
int getOffset()
SocketAddress getSocketAddress()
void setSocketAddress(SocketAddress address)
void setData(byte[] buf, int offset, int length)
И прочие…
Слайд 32

Класс DatagramSocket Экземпляры являются не ориентированными на соединение сокетами Конструкторы DatagramSocket()

Класс DatagramSocket

Экземпляры являются не ориентированными на соединение сокетами
Конструкторы
DatagramSocket()
DatagramSocket(int port, InetAddress

laddr)
И другие…
Методы
void bind(SocketAddress addr)
void close()
void connect(InetAddress address, int port)
void send(DatagramPacket p)
void receive(DatagramPacket p)
И другие…
Слайд 33

Передача дейтаграмм

Передача дейтаграмм

Слайд 34

Uniform Resource Locator URL – адрес ресурса в Интернет Имя протокола

Uniform Resource Locator

URL – адрес ресурса в Интернет
Имя протокола Протокол, используемый для

связи
Имя хоста Имя компьютера, на котором расположен ресурс
Имя файла Путь к файлу на компьютере
Номер порта Номер порта для соединения (необязателен)
Ссылка Ссылка на обработчик работы с протоколом (необязательна)
Может быть абсолютным и относительным

URL gamelan = new URL("http", "www.gamelan.com", 80,
"pages/Gamelan.network.html");

Слайд 35

Прямое чтение из URL import java.net.*; import java.io.*; public class URLReader

Прямое чтение из URL

import java.net.*;
import java.io.*;
public class URLReader {
public static

void main(String[] args) throws Exception
{
URL yahoo = new URL("http://www.yahoo.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(
yahoo.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
Слайд 36

Чтение из URL-соединения import java.net.*; import java.io.*; public class URLConnectionReader {

Чтение из URL-соединения

import java.net.*;
import java.io.*;
public class URLConnectionReader {
public static void

main(String[] args) throws Exception
{
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yc = yahoo.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
Слайд 37

Запись в URL-соединение import java.io.*; import java.net.*; public class Reverse {

Запись в URL-соединение

import java.io.*;
import java.net.*;
public class Reverse {
public static void

main(String[] args) throws Exception {
if (args.length != 1) {
System.err.println("Usage: java Reverse" +
"string_to_reverse");
System.exit(1);
}
String stringToReverse = URLEncoder.encode(args[0],
"US-ASCII");
URL url = new URL(
"http://java.sun.com/cgi-bin/backwards");
Слайд 38

Запись в URL-соединение URLConnection connection = url.openConnection(); connection.setDoOutput(true); PrintWriter out =

Запись в URL-соединение

URLConnection connection = url.openConnection();
connection.setDoOutput(true);
PrintWriter out =

new PrintWriter(
connection.getOutputStream());
out.println("string=" + stringToReverse);
out.close();
BufferedReader in = new BufferedReader(
new InputStreamReader(
connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
Слайд 39

Спасибо за внимание!

Спасибо за внимание!