Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
31f0278
Начал писать сервер на асинхронных каналах
pvktk Dec 7, 2018
3d6ba2c
Написана часть кода для клиента.
pvktk Dec 12, 2018
8c04ed7
Написан скачиватель отдельного файла.
pvktk Dec 13, 2018
7ec70ba
Убран ReadWriteLock в клиенте. Мапы сделаны concurrent.
pvktk Dec 14, 2018
44ce551
Весь код написан.
pvktk Dec 15, 2018
690260c
Настроен maven-assembly-plugin
pvktk Dec 15, 2018
7f12c90
В main запускается один главный поток, для облегчения тестирования.
pvktk Dec 16, 2018
592d090
Добавлен тест для сервера.
pvktk Dec 17, 2018
f26b291
Добавлена инструкция по сборке.
pvktk Dec 17, 2018
782cd47
Исправлена бага при чтении из канала в буфер.
pvktk Dec 18, 2018
2cb97f2
Исправлены баги сервера.
pvktk Dec 19, 2018
b127922
Добавлен тест реакции клиента на базовые команды.
pvktk Dec 19, 2018
620fedc
Добавлен тест на скачивание с другого пира.
pvktk Dec 20, 2018
64214be
Добавлен тест скачивания с 2 пиров.
pvktk Dec 20, 2018
dad3dca
Исправлена бага при повторном добавлении файла.
pvktk Dec 21, 2018
b942e81
Переделал на RandomAccessFile.
pvktk Dec 22, 2018
e477f21
Добавлено отображение размера файла в частях в выводе команды list.
pvktk Dec 22, 2018
60fd96f
Унифицирован код команд status и list.
pvktk Dec 22, 2018
d1f5f5b
обновлен readme
pvktk Dec 22, 2018
5b154f9
Подправлены сообщения о включении/выключении.
pvktk Dec 22, 2018
483b337
Добавлена обработка ввода чего-то вместо числа.
pvktk Dec 23, 2018
ce667b0
Сделано ограничение на количество одновременно скачивающихся кусков ф…
pvktk Dec 25, 2018
85f1c97
Исправил замечания.
pvktk Dec 26, 2018
92a22e1
Сделал double check вместо synchronized в getOrCreateFile в FilesHolder.
pvktk Dec 26, 2018
7dd71bb
Убраны закрытия DataStream привязанных к сокету.
pvktk Dec 27, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
# java_homeworks
### Torrent

Для сборки выполнить

```
mvn install

```

В папке target появятся client.jar и server.jar .
Клиенту при запуске можно передать имя хоста. По умолчанию localhost.

У клиента есть команда `help`, показывающая список команд.
99 changes: 99 additions & 0 deletions torrent/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>1</groupId>
<artifactId>torrent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- <packaging>jar</packaging> -->

<name>torrent</name>
<url>http://maven.apache.org</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.9</source>
<target>1.9</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>torrent_server</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>
torrent.server.Main
</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>server</finalName>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
<execution>
<id>torrent_client</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>
torrent.client.Main
</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>client</finalName>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-io -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</project>
14 changes: 14 additions & 0 deletions torrent/src/main/java/torrent/client/FileProblemException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package torrent.client;

public class FileProblemException extends Exception {

/**
*
*/
private static final long serialVersionUID = 1L;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

зачем? оно ж не сериализуется

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это подсказка IDE была.


public FileProblemException(String string) {
super(string);
}

}
64 changes: 64 additions & 0 deletions torrent/src/main/java/torrent/client/FilesDownloader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package torrent.client;

import java.io.IOException;
import java.net.SocketAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import torrent.client.FilesHolder.FileStatus;

public class FilesDownloader {

private FilesHolder filesHolder;
private SocketAddress toServer;

private ExecutorService pool = Executors.newCachedThreadPool();

private Map<Integer, Future<?>> fileDownloadsFutures = new HashMap<>();

public FilesDownloader(FilesHolder stm, SocketAddress toServer) {
this.filesHolder = stm;
this.toServer = toServer;
stm.fileStatus.forEach((id, status) -> {
if (status == FileStatus.Downloading ) {
try {
startFileDownload(id);
} catch (IOException e) {
System.err.println("Failed. to start download at startup");
e.printStackTrace();
}
}
});
}

public boolean startFileDownload(int fileId) throws IOException {
if (fileDownloadsFutures.containsKey(fileId)) {
return false;
}

filesHolder.fileStatus.put(fileId, FileStatus.Downloading);

SingleFileDownloader downloader = new SingleFileDownloader(toServer, filesHolder, fileId, this);
fileDownloadsFutures.put(fileId, pool.submit(downloader));
return true;
}

public void stopFileDownload(int fileId) {
if (!filesHolder.fileStatus.containsKey(fileId)) {
throw new IllegalStateException("This file wasn't been downloading");
}

if (filesHolder.fileStatus.get(fileId) != FileStatus.Downloading) {
return;
}

fileDownloadsFutures.get(fileId).cancel(true);
fileDownloadsFutures.remove(fileId);

filesHolder.fileStatus.put(fileId, FileStatus.Paused);
}

}
Loading