- PVSM.RU - https://www.pvsm.ru -
Здравствуй!
Картинка отсюда [1]
Предлагаю в качестве тренировки для
Общаются между собой две машины. Шлют друг другу цифровые данные, натурально нули и единицы. Только канал между ними не очень: биты регулярно то искажаются, то пропадают вовсе. Допустим, наш канал из 20 бит в среднем один бит ломает, другой теряет. А теперь пишем алгоритм, наиболее оптимально эти данные передающий.
Нужно найти компромисс между оверхедом над полезной нагрузкой сети, и временем работы передающей и принимающей машин.
Вы скажете, серьезные ребята из IEEE и смежных организаций уже всё давно придумали, и будете правы. Но когда это мешало переизобретать, just for lulz? И вылезти ненадолго из зоны комфорта надежных и простых сокетов (Не подсматривая какие-нибудь RFC [3])? Тем более, делать это будем на JavaScript, в браузере, без сторонних библиотек, еще желательно чтобы на один экран влезло:
Вот прямо тут [4]
Понимаю предвзятое отношение многих к JavaScript, однако его единственного можно за 5 минут встроить в браузер и дать возможно редактировать и исполнять. Несложный базовый синтаксис, пишешь будто на псевдкоде.
Весь код исполняется локально. Подключен CodeMirror [5] для редактора кода.
Пишем содержимое двух функций, периодически вызываемых на передающей (Sender Source) и (Receiver Destination) машинах.
В нашем распоряжении контекст this, имеющий аж 5 методов:
var runs = this.counter();
Счетчик того, сколько раз была вызвана основая функция. Помогает ориентироваться во времени, для отсчета таймуатов например.
var frame = this.getPayload(n);
Доступен на передающей машине. Считывает и возвращает следующие n
бит полезной нагрузки.
this.write(frame);
Передает frame
, являющийся массивом бит, другой машине. Проходя по каналу передачи, сообщение, возможно, будет искажено.
var frame = this.read(n);
Считывает из входящего сетевого буфера до n
бит. Если ничего нет, вернет пустой массив.
this.acceptPayload(frame);
Доступен на принимающей машине. Помещает frame
в результирующий массив.
Если основная функция вернет true
, значит она хочет быть вызвана еще раз в будущем. Иначе, машина завершает свое исполнение. На принимающей машине вызовется проверка целостности принятых данных, а также подсчитается оверхед.
Я добавил несколько примеров исходного кода:
Между первой идеей и последней точкой этой статьи пока что еще прошло меньше 12 часов, так что не обессудьте, если что пропустил. Пишите, поправлю как можно оперативней.
Автор: Денис Кильчичаков
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/259406
Ссылки в тексте:
[1] Картинка отсюда: http://pikabu.ru/story/odin_slomal_vtoroy_poteryal_4778012
[2] мозга: http://www.braintools.ru
[3] RFC: https://tools.ietf.org/html/rfc1661
[4] Вот прямо тут: https://kilchichakov.com/dtc/data-transfer.html
[5] CodeMirror: https://codemirror.net/
[6] Источник: https://habrahabr.ru/post/332134/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.