Проектът е разделен на две основни части, на клиент и на централен сървър.
- клиентът е конкретен начин за комуникация между потребителя и централният сървър, прикриващ ненужните неща от командите като
- това на кой порт слуша, не искаме всеки път клиентът да трябва да пише, че слуша на даден порт във всяка команда
- това как му е потребителското име, не искаме да може даден потребител да се преструва на някой друг
- клиентският сървър също така знае кои файлове е споделил, така че дори и да получи заявка за файл, който не е споделен, той ще я откаже
Следвани са ООП принципите, така че лесно да се подменят части от проекта. Лесно в бъдеще може да се направи вместо със in-memory база от данни да работи със истинска, или форматът на съобщенията не е в чист текст, а например JSON или XML. Лесно могат да се добавят нови функционалности както и на сървъра така и на клиента.
Библиотеките от които зависи са
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
от активните