Немного потоков. UDP to all json, tcp

Содержание

Слайд 2

ПРИ ЗАВЕРШЕНИИ ПОТОКА МЫ ДОЛЖНЫ ПЕРЕСТАТЬ СЛУШАТЬ СЕТЬ, И ОТКЛЮЧИТЬСЯ.

Но второй поток,

ПРИ ЗАВЕРШЕНИИ ПОТОКА МЫ ДОЛЖНЫ ПЕРЕСТАТЬ СЛУШАТЬ СЕТЬ, И ОТКЛЮЧИТЬСЯ. Но второй
который вызывает метод Receive, не знает о том, что надо перестать слушать. Нам надо как-то уведомить его о том, что пора закончить работу.

Слайд 3

CANCELLATIONTOKEN

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

CANCELLATIONTOKEN CancellationToken – стандартный механизм оповещения о необходимости закончить работу некоторого потока.
того чтобы создать такой токен необходимо сделать CancellationTokenSource, объект этого типа раздает отменяющий токен, и при вызове метода Cancel переводит все выданные токены в состояние «Отменен»
Поток, который работает параллельно, должен в удобное для него время проверить, отменен ли токен, и если отменен, прекратить свою работу.

Слайд 4

Наша программа

Listen

UdpClient

По умолчанию ждет сообщения вечность.
ReceiveTimeout = 0
Нам нужно ждать некоторое определенное

Наша программа Listen UdpClient По умолчанию ждет сообщения вечность. ReceiveTimeout = 0
время, и проверять, не пора ли нам закончить слушать

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

Слайд 5

ИСКЛЮЧЕНИЕ – МЕХАНИЗМ ОПОВЕЩЕНИЯ ВЫЗЫВАЮЩЕГО КОДА О ПРОИЗОШЕДШЕЙ ИСКЛЮЧИТЕЛЬНОЙ СИТУАЦИИ. КАК ПРАВИЛО

ИСКЛЮЧЕНИЕ – МЕХАНИЗМ ОПОВЕЩЕНИЯ ВЫЗЫВАЮЩЕГО КОДА О ПРОИЗОШЕДШЕЙ ИСКЛЮЧИТЕЛЬНОЙ СИТУАЦИИ. КАК ПРАВИЛО
- ОШИБКЕ

Исключение может бросить кто угодно и когда угодно. Мы можем ловить эти исключения, и анализировать их, чтобы предпринять те или иные действия в зависимости от того, что произошло
При исключении про отсутствие сообщения мы просто проверим, надо ли остановиться, но при какой-то неизвестной ошибке мы будем вынуждены развести руками и крашнуть программу ☹

Слайд 6

ДЛЯ ОБЩЕНИЯ СО ВСЕМИ В ЛОКАЛЬНОЙ СЕТИ НАМ ВСЕМ НЕОБХОДИМО СИДЕТЬ НА

ДЛЯ ОБЩЕНИЯ СО ВСЕМИ В ЛОКАЛЬНОЙ СЕТИ НАМ ВСЕМ НЕОБХОДИМО СИДЕТЬ НА
ОДНОМ ПОРТУ, ЧТОБЫ СЛУЧАЙНО НЕ ОТПРАВИТЬ ДАННЫЕ НЕ ТУДА. И ДЕЛАТЬ ОЧЕНЬ ПРОСТЫЕ ВЕЩИ

Наша программа

Слушает сеть, выводит на консоль все, что получил зеленым цветом

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

Слайд 7

А ТЕПЕРЬ МЫ ХОТИМ УЗНАТЬ, СКОЛЬКО ЧЕЛОВЕК ПОЛУЧИЛИ НАШЕ СООБЩЕНИЕ

Для этого все,

А ТЕПЕРЬ МЫ ХОТИМ УЗНАТЬ, СКОЛЬКО ЧЕЛОВЕК ПОЛУЧИЛИ НАШЕ СООБЩЕНИЕ Для этого
кто получил наше сообщение должны сказать нам, что они получили это сообщение.
Для того чтобы получатель мог точно сказать, что он получил именно то сообщение, у каждого сообщения должен быть уникальный идентификатор. И его надо передавать вместе с сообщением.
Мы можем придумать свой формат данных, допустим идентификатор занимает 16 байт, а остальные байты – сам текст. Но мы так делать не будем. Мы будем использовать общепринятый формат структуризации данных JSON.

Слайд 8

JSON ЕСТЬ НАБОР ПАР КЛЮЧ - ЗНАЧЕНИЕ

Ключ – это текст. Важно заметить,

JSON ЕСТЬ НАБОР ПАР КЛЮЧ - ЗНАЧЕНИЕ Ключ – это текст. Важно
что у самого верхнего уровня нет ключа. Это корень.
А значением может быть число, строка, объект, массив.

Слайд 9

ВОТ КАК БУДЕТ ВЫГЛЯДЕТЬ НАШЕ СООБЩЕНИЕ ПРО ОТПРАВКУ СООБЩЕНИЯ В ЧАТ.

{
“id” :

ВОТ КАК БУДЕТ ВЫГЛЯДЕТЬ НАШЕ СООБЩЕНИЕ ПРО ОТПРАВКУ СООБЩЕНИЯ В ЧАТ. {
“5f72d739-593d-4b93-a71b-2a6730da2a19”,
“Text” : “Hello world! Or any other text”
}

Слайд 10

ТАКОЕ СООБЩЕНИЕ БУДЕТ ПОНЯТНО ПРИНИМАЮЩЕЙ СТОРОНЕ

Принимающая сторона примет такое сообщение, выведет текст

ТАКОЕ СООБЩЕНИЕ БУДЕТ ПОНЯТНО ПРИНИМАЮЩЕЙ СТОРОНЕ Принимающая сторона примет такое сообщение, выведет
на экран, и отправит обратно сообщение с id принятого сообщения, сказав, что сообщение получено и все ок
Но постойте, как мы отличим приятые сообщения? Что нам пришло? Новое сообщение или подтверждение получения старого? Хм…
Значит надо договориться, что каждое сообщение имеет как минимум одно поле – его тип.

Слайд 11

ТЕПЕРЬ СООБЩЕНИЕ БУДЕТ ВЫГЛЯДЕТЬ ТАК

{
“messageType” : 0
“id” : “5f72d739-593d-4b93-a71b-2a6730da2a19”,
“Text” : “Hello world!

ТЕПЕРЬ СООБЩЕНИЕ БУДЕТ ВЫГЛЯДЕТЬ ТАК { “messageType” : 0 “id” : “5f72d739-593d-4b93-a71b-2a6730da2a19”,
Or any other text”
}

Слайд 12

ЧТО ТАКОЕ MESSAGETYPE?

messageType определяет тип содержимого в передаваемом JSON объекте.
Так, 0 будет

ЧТО ТАКОЕ MESSAGETYPE? messageType определяет тип содержимого в передаваемом JSON объекте. Так,
использоваться для отправляемых сообщений
А 1 будет говорить о том, что это сообщение о прочтении некоторого ранее принятого сообщения

Слайд 13

ТАК, ПРИНЯВ СООБЩЕНИЕ ПРОГРАММА ОТПРАВИТ ОБРАТНО СООБЩЕНИЕ СЛЕДУЮЩЕГО ВИДА

{
“messageType” : 1
“readedMessageID” :

ТАК, ПРИНЯВ СООБЩЕНИЕ ПРОГРАММА ОТПРАВИТ ОБРАТНО СООБЩЕНИЕ СЛЕДУЮЩЕГО ВИДА { “messageType” :
“5f72d739-593d-4b93-a71b-2a6730da2a19”
}