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
143 changes: 143 additions & 0 deletions torrent/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
# Torrent
* На трекере хранится список файлов и информация об активных пользователях, у которых есть те или иные файлы (возможно не целиком).
* С помощью клиентского приложения можно просматривать список файлов на трекере, а также добавлять новые и выбирать файлы из списка для скачивания.
* Файлы условно разбиваются на последовательные блоки бинарных данных константного размера (например 10M). Последний блок может иметь меньший размер. Блоки нумеруются с нуля.
* Клиент при подключении отправляет на трекер список раздаваемых им файлов.
* При скачивании файла клиент получает у трекера информацию о клиентах, раздающих файл (сидах), и далее общается с ними напрямую.
* У отдельного сида можно узнать о том, какие полные части у него есть, а также скачать их.
* После скачивания отдельных блоков некоторого файла клиент становится сидом.
---
# Torrent-tracker
* Хранит мета-информацию о клиентах и раздаваемых файлах

* **Порт сервера: 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 — идентификатор файла

**Примечание:**<br/>
* Если клиент А и клиент Б решили опубликовать файл 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, если информация успешно обновлена

**Примечание:**<br/>
* Клиент обязан исполнять данный запрос каждые 5 минут, иначе сервер считает, что клиент ушел с раздачи
---
# Torrent-client
* Порт клиента указывается при запуске и передается на трекер в рамках запроса update
* Каждый файл раздается по частям, размер части — константа на всё приложение
* Клиент хранит и раздает эти самые части
* Запросы:
* stat — доступные для раздачи части определенного файла
* get — скачивание части определенного файла

---
### Stat
Формат запроса:
<1: Byte> <id: Int>,
id — идентификатор файла
Формат ответа:
<count: Int> (<part: Int>)*,
count — количество доступных частей
part — номер части

**Примечание:**<br/>
* Часть считается доступной для раздачи, если она хранится на клиенте целиком
---
### Get
Формат запроса:
<2: Byte> <id: Int> <part: Int>
id — идентификатор файла,
part — номер части
Формат ответа:

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

# Запуск

Для запуска приложения нужно выполнить следующие шаги:

* склонировать [репозиторий](https://github.com/lergor/NetworksLab2019HSE.git)
* переключиться на нужную ветку: `git co torrent`
* зайти в директорию `torrent`
* запустить команды `gradle trackerJar` и `gradle clientJar` для сборки приложений трекера и клиента -- TrackerApp и ClientApp соответственно
* запустить трекер: ```java -jar build/libs/trackerApp-jar-1.0-SNAPSHOT.jar```
* запустить клиент: ```java -jar build/libs/clientApp-jar-1.0-SNAPSHOT.jar```

## Использование

**Трекер:**</br>
```
exit -- завершить работу приложения
```

**Клиент:**</br>
```
help - напечатать список доступных комнад
list - получить список раздаваемых файлов
sources <id> - получить список клиентов, владеющих определенным файлов целиком или некоторыми его частями
upload <path> - добавить файл на раздачу
download <id> - скачать файл с указанным `id`
exit - завершить работу приложения
```

## 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

```
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
172 changes: 172 additions & 0 deletions torrent/gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading