Необходимо разработать peer-to-peer файловый «загрузчик», реализующий следующие требования:
- Информация о файле для загрузки хранится в определённом хандлере: в нём хранится информация о разбиении файла на небольшие фрагменты.
- Каждый клиент сообщает на централизованный сервер информацию о всех кусочках, которые клиент уже скачал и предлагает взять другим клиентам.
- Клиент обращается к серверу для списка доступных клиентов, которые владеют интересующемся файлом.
- Клиент обращается к другим клиентам по каждому из кусочков.
- Собрав все куски клиент собирает файл и сообщает, что файл скачан и доступен.
Описание апи в парадигме grpc
Централизованный сервер. Хранит информацию о пирах
"Торрент-клиент"
- запускаем сервер
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"
}
]
}