Skip to content

ivantenevvasilev/java-p2p-file-sharing

Repository files navigation

Torrent Server

Peer2Peer File Sharing

Архитектура

Проектът е разделен на две основни части, на клиент и на централен сървър.

  • клиентът е конкретен начин за комуникация между потребителя и централният сървър, прикриващ ненужните неща от командите като
    • това на кой порт слуша, не искаме всеки път клиентът да трябва да пише, че слуша на даден порт във всяка команда
    • това как му е потребителското име, не искаме да може даден потребител да се преструва на някой друг
  • клиентският сървър също така знае кои файлове е споделил, така че дори и да получи заявка за файл, който не е споделен, той ще я откаже

Следвани са ООП принципите, така че лесно да се подменят части от проекта. Лесно в бъдеще може да се направи вместо със in-memory база от данни да работи със истинска, или форматът на съобщенията не е в чист текст, а например JSON или XML. Лесно могат да се добавят нови функционалности както и на сървъра така и на клиента.

Писано е на Java 11

Библиотеките от които зависи са

  • annotations-java8
  • junit-4.12
  • byte-buddy-1.90
  • byte-buddy-agent-1.90
  • hamcrest-4.12
  • objectnesis-2.6
  • mockito-core-2.23.0

Единствено първата библиотека е нужна за основното приложение, останалите са единствено за тестовете. С леки промени може да се премахне и annotations-java8, но е полезна по време на разработката.

За стартиране на приложението

Има две входни точки, една за сървъра и една за клиента. Съответните им main методи се намират съответно във файловете TorrentServerStart и TorrentClientStart, нужно е да се пусне първо сървъра и да му се въведат IP/domain name на което да бъде закачен и порт на който да слуша. За клиента са нужни повече неща, име на отдалечен сървър, порт на който слуша сървъра и порт на който клиетнския сървър да слуша, освен това след установяване на връзката е нужно да даде потребителско име, което не е ползвано от друг клиент до момента.

Клиентски команди:

Клиентът пише тези команди на стандартният вход и така комуникира със централният сървър и останалите клиенти и техните сървъри

  • list-users - изписва всички свързани до момента потребители към сървъра
  • list-files - изпизсва всички споделени до момента файлове и потребителите които ги споделят
  • register-user <username> - не е достъпна директно от клиента, но се праща при първоначално свързване към сървъра
  • register file1 [, file2, ... ,filen] - обявява на сървъра, че file1...filen са споделени от потребителя
  • unregister file1 [, file2, ... ,filen] - маха от обявленията на сървъра file1...filen
  • download user remote_path local_path - праща заявка към сървъра на user, че иска да изтегли файл на remote_path, ако този файл е споделен, отдалеченият клиент го праща и той е записан със името local_path
  • disconnect - спира слушащата нишка отговаряща за отдалечени връзки и прекратява връзката със централния сървър и терминира приложението.

Сървърни Команди:

Тези команди се получават от клиент чрез socket и така централният сървър разбира за свързани потребители и обявени споделени файлове. Тези команди не се пишат директно от клиента, но може да се пишат от команди като telnet и други.

  • list-files - връща на запитващият клиент списък със обявените файлове и потребители които отговарят за тях.
  • list-users - връща на запитващият клиент списък с потребители, които са свързани със централният сървър и портовете на техните сървъри на които слушат за заявки за теглене на файл.
  • register-files username file1 [, file2, ..., filen] - обявава file1...filen за споделени на потребител username
  • unregister-files username file1 [, file2, ..., filen] премахва от обявленията file1...filen за споделени на потребител username
  • unregister-user username - премахва потребител username от активните

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published