Skip to content

Latest commit

 

History

History
97 lines (82 loc) · 2.88 KB

README.RU.md

File metadata and controls

97 lines (82 loc) · 2.88 KB

Torrent

Задание

Необходимо разработать peer-to-peer файловый «загрузчик», реализующий следующие требования:

  • Информация о файле для загрузки хранится в определённом хандлере: в нём хранится информация о разбиении файла на небольшие фрагменты.
  • Каждый клиент сообщает на централизованный сервер информацию о всех кусочках, которые клиент уже скачал и предлагает взять другим клиентам.
  • Клиент обращается к серверу для списка доступных клиентов, которые владеют интересующемся файлом.
  • Клиент обращается к другим клиентам по каждому из кусочков.
  • Собрав все куски клиент собирает файл и сообщает, что файл скачан и доступен.

Реализация

api

Описание апи в парадигме grpc

tracker

Централизованный сервер. Хранит информацию о пирах

peer

"Торрент-клиент"

Пример работы

  • запускаем сервер
cd tracker
go build .
./tracker
  • запускаем 1 клиента (тот, который загрузит файл)
cd peer
go build .
./peer -http=8002 -grpc=9002
  • запускам 2 клиента (тот, который скачает файл у 1 клиента)
cd peer
go build .
./peer -http=8000 -grpc=9000
  • загружаем файл на сервер
curl -d "{\"name\":\"/home/space/5 sem/networks/grpctorrent/peer/some.txt\"}" -X POST http://localhost:8002/upload | jq
  • спрашиваем информацию о файле на стороне клиента
curl http://localhost:8002/files/some.txt | jq
{
  "name": "some.txt",
  "piece_length": "1",
  "pieces": "24",
  "length": "24",
  "hash": "9702842ac5824617babda6a32791ac2f"
}
  • скачиваем файл
curl -d "{\"hash\":\"9702842ac5824617babda6a32791ac2f\"}" -X POST http://localhost:8000/download | jq
{
  "name": "some.txt",
  "piece_length": "1",
  "pieces": "24",
  "length": "24",
  "hash": "9702842ac5824617babda6a32791ac2f"
}
  • список всех файлов на трекер-сервере
curl http://localhost:8000/files | jq
{
  "count": "1",
  "files": [
    {
      "name": "some.txt",
      "piece_length": "1",
      "pieces": "24",
      "length": "24",
      "hash": "9702842ac5824617babda6a32791ac2f"
    }
  ]
}