Giter Site home page Giter Site logo

torrent's Introduction

Инструкция

Данный проект состоит из двух компонент: трекера и клиента. Трекер нужен для того, чтобы клиент при скачивании файла мог получить список пиров, которые раздают этот документ. Клиент запускается локально и в течение всей работы слушает входящие запросы, раздает те файлы которые есть у этого пользователя. Также у клиента есть две команды upload и download. Первая возвращает торрент файл документа и регистрирует его в трекере (чтобы его можно было скачивать). Вторая может по торрент файлу скачивает у других пользователей нужный файл.

Трекер

  1. Трекер реализован на питоне с помощью фремворка Flask, т.к. этот способ выглядит наименее простым.
  2. Поднять с localhost:5000 или кастомным хостом:
python3 tracker/server.py
python3 tracker/server.py 0.0.0.0 9545
  1. Хранит пиры внутри памяти, поэтому при прекращении работы все данные будут утеряны.
  2. Обработка запросов:
POST http://localhost:5000/hash 
{
  "listening_port": 300,
  "listening_host": "0.0.0.0"
}

Возвращает уникальный хэш (uuid), который нужен для индентификации документов (каждому раздаваемому документу соответсвует свой уникальный хэш). И добавляет пир(хост + порт) в список известных пиров для этого хэша, то есть те пиры, которые раздают этот документ.

POST localhost:5000/peers
{
  "hash": "ca74aa76-e687-45e6-87c2-8fa9fc23d063",
  "listening_port": 300,
  "listening_host": "0.0.0.0"
}

Возвращает список всех пиров, которые раздают документ с этим хэшем и добавляет запрашиваемый хост и порт в список известных хостов.

Клиент

  1. Примеры конфигурации клиента находяться в cfgs:
{
  "self": {
    "service": "../data/test1", # Относительный путь к папка где храняться торрент файлы (и файлы для раздачи)
    "host": "0.0.0.0", # Хост на котором клиент слушает другие запросы
    "port": 1000 # Порт на котором клиент слушает другие запросы
  },
  "tracker": {
    "host": "http://0.0.0.0", # Хост трекера
    "port": 5000 # Порт трекера
  }"
}
  1. Запуск локально. Аргумент это относительный путь к конфигу:
python3 client/main.py cfgs/cfg.json
  1. Команда upload:
upload path_to_file path_to_torrent
  • По файлу создает торрент файл.
  • Ожидаемый вывод: SUCCESSFUL UPLOAD
  1. Команда download:
download path_to_torrent path_to_file
  • Загружает файл по торрент файлу.
  • Ожидаемый вывод: SUCCESSFUL DOWNLOAD
  1. Процесс загрузки может прерываться, его можно восстановить запустив команду еще раз.
  2. Клиент можно выключать, все торрент файлы и файлы храняться в данных
  3. Общение между клиентами происходит напрямую по сокетам.
  4. Каждый сегмент проверяется на хэш сумму, что позволяет немного защититься от злоумышленников.

Пример торрент файла:

{
  "FileInfo": {
    "Size": 2048,
    "PartSize": 256,
    "Parts": [
      "4ebea4f2cc3c93321608b94eb98cf2c1280d7072",
      "0a552d04e3435c346332454b1024d41d1e802abe",
      "693b04c64f7f1633a49057ca51431a0bb4bc9650",
      "26c9a81bba906a7e09b2bd13aaabb1a6be205b9b",
      "e863d1678c6f6ffb2165b53842e66e0d14a05650",
      "7aaa8e1d2d46a7fada13c5acd084323b3021d9ba",
      "8299079c05ecf7cf39880ed609ac0b4bcfc84316",
      "6225a56e16b52710fbd64a3120d03584e7c82a29"
    ],
    "Hash": "29964bae-53e9-4c3f-b620-9c583aeb64b5"
  }
}

Hash -> индентификатор документа (получается с помощью регистрации в трекере)

Очевидные недоработки

  1. In-memory хранилище в трекере. Можно хотя бы поднять редис
  2. Нет прогресса загрузки, что не очень удобно для загрузки больших данных
  3. Клиенты при скачивании файлов не пересматривают пиры с которых они берут документы (из-за этого не видят новые пиры)
  4. Плохое логгирование
  5. Нет тестирования

torrent's People

Contributors

millb avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.