Академический Документы
Профессиональный Документы
Культура Документы
1
Терминология
2
Сетевая архитектура
● Клиент-серверная архитектура
● Централизованное управление и обмен данными
● Сервер предоставляет сервисы в режиме ожидания запроса
● Клиент получает результат от сервера по запросу
● Надежность зависит от сервера — критический узел
● Одноранговая архитектура (пиринговая)
● Децентрализованное управление и обмен данными
● Все узлы (пиры) равноправны, могут быть клиентом и сервером
● Нет критического узла
3
Модель передачи данных
Прикладной HTTP
Прикладной Представительский
Сеансовый
Сетевой Сетевой IP
Канальный Ethernet
Канальный
Физический витая пара
4
Пакеты
Уровень Уровень + 1
З Д З Д
Уровень - 1 Уровень
З Данные З Данные
0100010000111101010
5
Сетевое взаимодействие в Java
6
IP-адрес
7
DNS
8
Порт
9
InetAddress
● Класс InetAddress
● Inet4Address Inet6Address
● Методы InetAddress (статические)
● InetAddress getLocalHost()
● InetAddress getByAddress(byte[] addr)
● InetAddress getByName(String name) — обращение к DNS
● Нестатические методы
● byte[] getAddress
● String getHostName()
10
InetSocketAddress
11
Сетевой обмен
● Клиент
● Может работать на любом хосте (сервер не знает, где именно)
● Порт выбирается при отправлении запроса (первый свободный)
● Посылает запрос серверу, ждет ответ
● Запрос
● Содержит информацию о клиенте и данные
● Сервер
● Работает на определенном хосте (известный IP-адрес)
● Прослушивает определенный порт (зависит от сервиса)
● Ждет запрос от клиента, посылает ответ
● Ответ
● Содержит данные
12
Диаграмма последовательностей
Клиент Сервер
Синхронный запрос
Асинхронный ответ
13
Обмен по протоколу UDP
14
Пример обмена по протоколу UDP
// клиент // сервер
SocketAddress a = SocketAddress a =
new InetSocketAddress(ADDR, PORT); new InetSocketAddress(PORT);
DatagramSocket s = DatagramSocket s =
new DatagramSocket(); new DatagramSocket();
DatagramPacket o = DatagramPacket i =
new DatagramPacket(b, b.length, a); new DatagramPacket(b, b.length);
s.send(o); s.receive(i);
for (byte j : b) {
System.out.println(j);
}
15
Обмен по протоколу TCP
16
Пример обмена по протоколу TCP
// клиент // сервер
17
Использование каналов и java.nio
18
Пример обмена по протоколу UDP (NIO)
// клиент // сервер
SocketAddress a = SocketAddress a =
new InetSocketAddress(ADDR, PORT); new InetSocketAddress(PORT);
DatagramChannel s = DatagramChannel s =
DatagramChannel.open(); DatagramChannel.open();
s.connect(a); s.bind(a);
ByteBuffer f = ByteBuffer.wrap(b); ByteBuffer f = ByteBuffer.wrap(b);
f.flip(); f.clear();
s.send(f, a); a = s.receive(f);
for (byte j : b) {
System.out.println(j);
}
19
Использование каналов и java.nio
● Протокол TCP
● ServerSocketChannel
◊ open()
◊ bind(SocketAddress local)
◊ SocketChannel accept()
● SocketChannel
◊ open(SocketAddress remote)
◊ write(ByteBuffer)
◊ read(ByteBuffer)
20
Пример обмена по протоколу TCP (NIO)
// клиент // сервер
● SocketChannel.configureBlocking(false)
● Методы read и write возвращают int — количество
прочитанных байт, или -1, если данных больше нет.
25
Протокол HTTP
26
Класс URL
27
Класс URLConnection
29
Функциональное программирование
30
Функциональное программирование
● Итерация → Рекурсия
● Проблема — ограничение стека
● Вызов функции — параметры и адрес возврата — в стек
● Во время работы функции локальные переменные в стеке
● Возврат — очистка стека и переход по адресу возврата
● Решение — хвостовая рекурсия
● Рекурсивный вызов функции — последняя команда
● Вместо повторных рекурсивных вызовов — замена параметров
и возврат к началу (фактически - итерация)
31
Факториал (итерация)
32
Факториал (рекурсия)
33
Факториал (хвостовая рекурсия)
34
Элементы λ-исчисления
35
Пример
● inc(x) = x + 1 inc(3)
● f(x) = x + 1 f(3)
● (x) → x + 1 ((x) → x + 1) (3)
● λx.x+1
● (x) → x + y
связанная
36
Пример
● sum(x,y) = x + y sum(3,4)
● f(x,y) = x + y f(3,4)
● (x,y) → x + y (3,4) ((x,y) → x + y) (3,4)
● Каррирование
● (x,y) → x + y
● (y) → x + y
● (x) → ((y) → x + y)
37
Функции обратного вызова (callback)
38
Лямбда-выражения и функциональные интерфейсы
39
Пример
Comparator<String> comp;
comp = (s1, s2) -> s1.length() - s2.length();
sort(comp);
40
Синтаксис λ-выражений
41
Захват переменных
class Test {
Test(int x) { }
static void staticMethod(int x) { }
void instanceMethod(int x) { }
}
Test t = new Test(1);
43
Функциональные интерфейсы
● java.lang.Runnable
void run();
new Thread(() -> { … }).start();
● java.util.Comparator<T>
int compare(T o1, T o2);
Collections.sort(list, (x,y) -> y - 2 * x);
● java.util.function.* - набор функциональных интерфейсов
общего назначения для разных случаев
45
Пакет java.util.function
● Supplier<R> { R get() }
● Consumer<T> { void accept(T t) }
● Predicate<T> { boolean test(T t) }
● Function<T,R> { R apply(T t) }
● UnaryOperator<T> { T apply(T t) }
● BiFunction<T,U,R> { R apply(T t, U u) }
● BinaryOperator<T> { T apply(T t1, T t2) }
46
Supplier - Поставщик
Supplier<R> {
R get()
}
● () -> Instant.now()
47
Consumer — Потребитель
Consumer<T> {
void accept(T t)
default Consumer andThen(Consumer after)
}
● s -> System.out.println(s)
48
Predicate — Утверждение
Predicate<T> {
boolean test(T t)
default Predicate and(Predicate other)
default Predicate or(Predicate other)
default Predicate negate()
}
49
Function — Функция
Function<T,R> {
R apply(T t)
default Function andThen(Function after)
default Function compose(Function before)
default Function identity()
}
● IntFunction<R> { R apply(int v) }
● LongFunction<R> { R apply(long v) }
● DoubleFunction<R> { R apply(double v) }
50
UnaryOperator — Унарный оператор
UnaryOperator<T> {
T apply(T t)
default UnaryOperator andThen(UnaryOperator after)
default UnaryOperator compose(UnaryOperator before)
default UnaryOperator identity()
}
● s -> String.toLowerCase(s)
51
BiConsumer
BiConsumer<T, U> {
void accept(T t, U u)
default BiConsumer andThen(BiConsumer after)
}
52
BiPredicate
BiPredicate<T, U> {
boolean test(T t, U u)
default BiPredicate and(BiPredicate other)
default BiPredicate or(BiPredicate other)
default BiPredicate negate()
}
53
BiFunction
BiFunction<T,U,R> {
R apply(T t, U u)
default BiFunction andThen(BiFunction after)
}
54
BinaryOperator
BinaryOperator<T> {
T apply(T t, T t)
default BinaryOperator andThen(BinaryOperator after)
static BinaryOperator maxBy(Comparator comp)
static BinaryOperator minBy(Comparator comp)
}
55
Пакет java.util.stream
56
Конвейеры и коллекции
57
Состав конвейера
● Конвейер =
● Источник
● Промежуточные операции (0 или больше)
● Завершающая операция (одна)
58
Пример
List<String> words
1) long count = 0;
for (String s : words) {
if (s.length() > 5) count++;
}
2) long count =
words.stream()
.filter(s -> s.length() > 5)
.count();
59
Источники конвейера
● Stream.empty()
● Stream.generate(Supplier<T> s)
● Stream.iterate(T seed, UnaryOperator<T> f)
60
Промежуточные операции
61
Завершающие операции
62
Классы и интерфейсы
● интерфейс BaseStream
● void close()
● S parallel()
● S sequential()
● S unordered()
● Iterator iterator()
● Spliterator spliterator()
● Интерфейс Stream<T>
● Интерфейсы IntStream, LongStream, DoubleStream
63
Spliterator
● Параллельный Iterator
● Spliterator trySplit() — возвращает часть элементов как
отдельный сплитератор
● boolean tryAdvance(Consumer action) — выполнить операцию
для очередного элемента
● void forEachRemaining(Consumer action) — выполнить операцию
для всех оставшихся элементов
64
Промежуточные операции
65
Промежуточные операции
66
Завершающие операции
67
Класс java.util.Optional<T>
68
Завершающие операции
● reduce(BinaryOperator accumulator)
.stream
.reduce((a, b) -> a * b) // подсчет произведения
● collect(Collector collector)
.stream
.collect(Collectors.toList());
69
Завершающие операции
● Collectors
● toCollection(Supplier factory), toList(), toSet()
● toMap(Function k, Function v, BinaryOperator merge, Supplier factory)
● toConcurrentMap
● joining(String delimiter, String prefix, String suffix)
● Collector<T> mapping(Function<T,U> mapper, Collector<U> s)
● minBy(Comparator), maxBy(Comparator), counting()
● Collector<Integer> summingInt(ToIntFunction mapper)
● Collector<Integer> averagingInt(ToIntFunction mapper)
● Collector<IntSummaryStatistics> summarizingInt(ToIntFunction mapper)
● reducing(identity, Function<T,U> mapper, BinaryOperator op)
● Map<K,List<T>> groupingBy(Function<T,K> classifier)
● Map<K,D> groupingBy(Function<T,K> m, Supplier f, Collector<T,D> s)
● groupingByConcurrent
● Map<Boolean,List<T>> partitioningBy(Predicate<T> predicate)
● Map<Boolean,D> partitioningBy(Predicate<T> p, Collector<T,D> s)
70
Проверки
● boolean anyMatch(Predicate<T> p)
● истина, если условие выполняется хотя бы для одного элемента
● При нахождении первого совпадения прекращает проверку
● boolean allMatch(Predicate<T> p)
● истина, если условие выполняется для всех элементов.
● При нахождении первого несовпадения прекращает проверку
● boolean noneMatch(Predicate<T> p)
● истина, если условие не выполняется ни для одного элемента.
● При нахождении первого совпадения прекращает проверку
71
Пример
72