Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,8 @@ build
.gradle
.idea
*.iml
out/
out/

.torrent
torrent/torrent
kek
45 changes: 45 additions & 0 deletions torrent/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Torrent

### Description

This repository contains simple torrent with tracker and client applications.

### How to run

In order to run this app, follow these steps:

* clone this repository
* checkout on branch *torrent*
* run `gradle trackerJar` and `gradle clientJar` to build jar for TrackerApp and ClientApp respectively
* go to the `build/libs` directory
* run ```java -jar trackerApp-jar-1.0-SNAPSHOT.jar``` and ```java -jar clientApp-jar-1.0-SNAPSHOT.jar``` to run Tracker or Client respectively

### Usage

Tracker:</br>
```
exit - shutdown the tracker app
```

Client:</br>
```
help - print usage
list - list available files on the tracker
sources <id> - list sources for file with the specified id
upload <path> - add file to the tracker
download <id> - download file with the specified id
exit - shutdown the client app
```

### File hierarchy
```
torrent/ - directory for downloads
.metainfo/ - directory for torrent metafiles
client/
parts/
[id]/[part] - directories named as id for parts of file
local_files_manager_file - stored client state with info about local files
tracker/
tracker_state_file - stored tracker state with info about available files

```
128 changes: 128 additions & 0 deletions torrent/Task.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# 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 проект
* Консольные трекер и клиент, позволяющие исполнять указанные запросы
* Тесты
* Документация процесса сборки артефактов вашего приложения
* В идеале, хотелось бы, чтобы этими артефактами были два shell-скрипта
(один для запуска клиента, другой - для сервера)
* Однако двух executable jar-файлов будет тоже достаточно
* Клиент должен сохранять информацию о раздаваемых файлах между перезапусками
* Трекер должен сохранять список раздаваемых файлов между перезапусками
---
# Примечания:
* Разрешается использовать библиотеки для упрощения ввода-вывода
* Рекомендуется взглянуть на DataInputStream и DataOutputStream
* То, как пишутся и читаются данные из потока, определяется реализацией DataInputStream и DataOutputStream
* Для передачи String используется алгоритм DataOutputStream.writeUTF
* IP адреса передаются как четыре последовательных байта: 127.0.0.1 -> 127/0/0/1
Срок: <b>17.12.2018 23:59</b>
---
# Формат сдачи
* Каждое задание выполняете в отдельной ветке в репозитории на GitHub
* Создаете pull request ветки в master этого же репозитория
* Тема PR: Java06. ДЗ 05, &lt;фамилия&gt; &lt;имя&lt;
* В комментарии упоминаете username преподавателя (@sproshev, @dsavvinov)
* Посылаете письмо преподавателю с такой же темой с ссылкой на pull request
Проверяйте табличку на странице курса на предмет того, что преподаватель увидел ваш PR
37 changes: 37 additions & 0 deletions torrent/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
plugins {
id 'java'
id 'application'
}

group 'ru.ifmo'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
mavenCentral()
}

task trackerJar(type: Jar) {
manifest {
attributes 'Main-Class': 'ru.ifmo.torrent.tracker.TrackerApp'
}
baseName = 'trackerApp-jar'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}

task clientJar(type: Jar) {
manifest {
attributes 'Main-Class': 'ru.ifmo.torrent.client.ClientApp'
}
baseName = 'clientApp-jar'
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}

dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.9.0'
compile group: 'org.apache.commons', name: 'commons-io', version: '1.3.2'
}
6 changes: 6 additions & 0 deletions torrent/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#Mon Dec 17 05:46:23 MSK 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-all.zip
Loading