Java II

604 (АУ) группа

Тимофей Брыксин

Студент TODO №1 №2 №3 №4 №5 №6
23 Lazy Factory VCS VCS 2 Simple FTP Torrent Torrent GUI
Гарифуллин Шамиль 1
Голованов Сергей 2
Горбунов Егор 1
Дмитрий Байдин 5
Жаворонков Эдгар 1
Мордберг Антон 1
Поляков Семен
Тищенко Дмитрий 6
Чаркин Костя 2
Ялышева Наталья 4

Задачи

Домашняя работа 6. 09.11.16
  1. Torrent GUI

    Требуется реализовать UI для торрент-клиента.

    UI должен позволять выполнять следующие операции:

    • просмотр доступных для скачивания (download) файлов

    • старт скачивания файла из вышеуказанного списка

    • загрузка (upload) нового файла

    • прогресс скачиваемого файла (например: "Загружено 74%")

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

    Срок: 29.11.2016 23:59

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


    Формат сдачи

    • Выполняете задание в отдельной ветке в репозитории на GitHub
    • Создаете pull request ветки в master этого же репозитория
    • Тема пулл-реквеста: Java05. ДЗ 04, <фамилия> <имя>
Домашняя работа 5. 19.10.16
  1. Torrent
    • На трекере хранится список файлов и информация об активных пользователях, у которых есть те или иные файлы (возможно не целиком).

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

    • Файлы условно разбиваются на последовательные блоки бинарных данных константного размера (например 10M). Последний блок может иметь меньший размер. Блоки нумеруются с нуля.


    Torrent

    • Клиент при подключении отправляет на трекер список раздаваемых им файлов.

    • При скачивании файла клиент получает у трекера информацию о клиентах, раздающих файл (сидах), и далее общается с ними напрямую.

    • У отдельного сида можно узнать о том, какие полные части у него есть, а также скачать их.

    • После скачивания отдельных блоков некоторого файла клиент становится сидом.


    Torrent-tracker

    • Хранит мета-информацию о раздаваемых файлах:

      • идентификатор
      • активные клиенты (недавно был update), у которых есть этот файл целиком или некоторые его части
    • Порт сервера: 8081

    • Запросы:

      • list — список раздаваемых файлов
      • upload — публикация нового файла
      • sources — список клиентов, владеющих определенным файлов целиком или некоторыми его частями
      • update — загрузка клиентом данных о раздаваемых файлах

    List

    Формат запроса:

    <1: Byte>
    

    Формат ответа:

    <count: Int> (<id: Int> <name: String> <size: Long>)*,
    count — количество файлов
    id — идентификатор файла
    name — название файла
    size — размер файла
    

    Upload

    Формат запроса:

    <2: Byte> <name: String> <size: Long>,
    name — название файла
    size — размер файла
    

    Формат ответа:

    <id: Int>,
    id — идентификатор файла
    

    Примечание

    • Если клиент А и клиент Б решили опубликовать файл abc.txt, то это будут разные файлы, иными словами каждый запрос на публикацию файла возвращает новый id

    Sources

    Формат запроса:

    <3: Byte> <id: Int>,
    id — идентификатор файла
    

    Формат ответа:

    <size: Int> (<ip: ByteByteByteByte> <clientPort: Short>)*,
    size — количество клиентов, раздающих файл
    ip — ip клиента,
    clientPort — порт клиента
    

    Update

    Формат запроса:

    <4: Byte> <clientPort: Short> <count: Int> (<id: Int>)*,
    clientPort — порт клиента,
    count — количество раздаваемых файлов,
    id — идентификатор файла
    

    Формат ответа:

    <status: Boolean>,
    status — True, если информация успешно обновлена
    

    Примечание

    • Клиент обязан исполнять данный запрос каждые 5 минут, иначе сервер считает, что клиент ушел с раздачи

    Torrent-client

    • Порт клиента указывается при запуске и передается на трекер в рамках запроса update

    • Каждый файл раздается по частям, размер части — константа на всё приложение

    • Клиент хранит и раздает эти самые части

    • Запросы:

      • stat — доступные для раздачи части определенного файла
      • get — скачивание части определенного файла

    Stat

    Формат запроса:

    <1: Byte> <id: Int>,
    id — идентификатор файла
    

    Формат ответа:

    <count: Int> (<part: Int>)*,
    count — количество доступных частей
    part — номер части
    

    Примечание

    • Часть считается доступной для раздачи, если она хранится на клиенте целиком

    Get

    Формат запроса:

    <2: Byte> <id: Int> <part: Int>
    id — идентификатор файла,
    part — номер части 
    

    Формат ответа:

    <content: Bytes>,
    content — содержимое части
    

    Требования:

    • Maven/Gradle проект

    • Консольные трекер и клиент, позволяющие исполнять указанные запросы

    • Тесты

    • Клиент должен сохранять информацию о раздаваемых файлах между перезапусками

    • Трекер должен сохранять список раздаваемых файлов между перезапусками


    Примечания:

    • Разрешается использовать библиотеки для упрощения ввода-вывода

    • Рекомендуется взглянуть на DataInputStream и DataOutputStream

    • То, как пишутся и читаются данные из потока, определяется реализацией DataInputStream и DataOutputStream

    • Для передачи String используется алгоритм DataOutputStream.writeUTF

    • IP адреса передаются как четыре последовательных байта: 127.0.0.1 -> 127/0/0/1

    Срок: 08.11.2016 23:59


    Формат сдачи

    • Задание выполняете в отдельной ветке в репозитории на GitHub
    • Создаете pull request ветки в master этого же репозитория
    • Тема PR: Java06. ДЗ 05, <фамилия> <имя>
Домашняя работа 4. 05.10.16
  1. Simple FTP

    Simple FTP

    Требуется реализовать сервер, обрабатывающий два запроса.

    • list — листинг файлов в директории на сервере
    • get — скачивание файла с сервера

    И клиент, позволяющий исполнять указанные запросы.

    Sockets:


    List

    Формат запроса:

    <1: Int> <path: String>
    path — путь к директории
    

    Формат ответа:

    <size: Int> (<name: String> <is_dir: Boolean>)*,
    size — количество файлов и папок в директории
    name — название файла или папки
    is_dir — флаг, принимающий значение True для директорий
    

    Если директории не существует, сервер посылает ответ с size = 0


    Get

    Формат запроса:

    <2: Int> <path: String>
    path — путь к файлу
    

    Формат ответа:

    <size: Long> <content: Bytes>,
    size — размер файла,
    content — его содержимое
    

    Если файла не существует, сервер посылает ответ с size = 0


    Примечания:

    • Разрешается использовать библиотеки для упрощения ввода-вывода
    • Рекомендуется взглянуть на DataInputStream и DataOutputStream
    • Должны быть реализованы тесты
    • Рекомендуется задуматься об интерфейсе сервера и клиента, возможно стоит сделать что-то подобное:
      • Server: start/stop
      • Client: connect/disconnect/executeList/executeGet

    Срок: 18.10.2016 23:59


    Формат сдачи

    • Задание выполняете в отдельной ветке в репозитории на GitHub
    • Создаете pull request ветки в master этого же репозитория
    • Тема PR: Java06. ДЗ 04, <фамилия> <имя>
Домашняя работа 3. 28.09.16
  1. VCS 2

    Advanced VCS

    • К системе контроля версий добавляются следующие команды:

      • status -- измененные/удаленные/недобавленные файлов
      • reset [file] -- данная команда сбрасывает состояние файла
      • rm [file] -- файл удаляется как из репозитория, так и физически
      • clean -- удаляются все файлы, не добавленные в репозиторий
    • Для каждой ревизии НЕ должна храниться полная копия репозитория

    • Срок: 04.09.2016 23:59

    Формат сдачи

    • Продолжаете задание в той же ветке в репозитории на GitHub
    • Если не создавали PR и не уведомляли о выполненном задании:
      • Создаете pull request ветки в master этого же репозитория
      • Тема PR: Java06. ДЗ 02, <фамилия> <имя>
Домашняя работа 2. 14.09.16
  1. VCS

    VCS

    • Система контроля версий, представляющая из себя консольное приложение и умеющая следующее:

      • add -- добавление файлов
      • commit + commit message (можно еще дату, автора, что угодно, но сообщение обязательно)
      • создание и удаление ветки
      • checkout по имени ревизии или ветки
      • log -- список ревизий вместе с commit message в текущей ветке
      • merge -- конфликты разрешайте (или не разрешайте) любым разумным способом, но при успешном слиянии терять коммиты не стоит

    Примечания

    • Не накладывается никаких ограничений на хранимые на диске данные и их формат

    • Дедлайн для первой сдачи: 27.09.2016 23:59


    Формат сдачи

    • Задание выполняете в отдельной ветке в репозитории на GitHub
    • Создаете pull request ветки в master этого же репозитория
    • Тема PR: Java06. ДЗ 02, <фамилия> <имя>
Домашняя работа 1. 07.09.16
Про модель памяти Java
  1. Lazy Factory

    http://tinyurl.com/hvhpsd8

© 2014-2018 HwProj