Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
26 changes: 26 additions & 0 deletions FTP/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
plugins {
id 'java-library'
}

dependencies {
api 'org.apache.commons:commons-math3:3.6.1'

implementation 'com.google.guava:guava:23.0'

compile group: 'org.jetbrains', name: 'annotations', version: '15.0'
compile group: 'commons-io', name: 'commons-io', version: '2.6'

testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.1.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: '5.0.0-M4'

testImplementation 'junit:junit:4.12'
}

repositories {
jcenter()
}
task wrapper(type: Wrapper) {
description = 'Generates gradlew[.bat] scripts'
gradleVersion = '4.6'
}
Binary file added FTP/gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
6 changes: 6 additions & 0 deletions FTP/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#Sun Apr 22 23:21:38 MSK 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
172 changes: 172 additions & 0 deletions FTP/gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

84 changes: 84 additions & 0 deletions FTP/gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions FTP/settings.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
rootProject.name = 'FTP'

101 changes: 101 additions & 0 deletions FTP/src/main/java/FTPClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import org.jetbrains.annotations.NotNull;

import java.io.*;
import java.net.Socket;

/**
* This class provides methods to work with FTPServer. These are:
*
* {@link FTPClient#list(String)} -- prints all files in the target directory.
*
* {@link FTPClient#get(String, String)} -- downloads and saves file from the
* server to the target file.
*/
@SuppressWarnings({"unused", "WeakerAccess"})
public class FTPClient {

private final static int BUF_SIZE = 2048;

@NotNull
final private DataOutputStream os;
@NotNull
final private DataInputStream is;

/**
* Creates new client, that connected to the FTPServer.
*
* @param url servers url.
* @param port port to connect.
* @throws IOException if any IOException occurred.
*/
public FTPClient(final String url, final int port) throws IOException {
final Socket socket = new Socket(url, port);
os = new DataOutputStream(socket.getOutputStream());
is = new DataInputStream(socket.getInputStream());
}

/**
* Creates new client, that connected to the FTPServer.
*
* @param url servers url.
* @throws IOException if any IOException occurred.
*/
public FTPClient(final String url) throws IOException {
this(url, FTPServer.DEFAULT_PORT);
}

/**
* Prints list of all files (including folders), inside the source folder.
*
* Also for every file prints whether the file is a directory or not.
*
* @param source target folder.
* @throws IOException if any IOException occurred.
*/
public void list(@NotNull final String source) throws IOException {
os.writeInt(1);
os.writeUTF(source);
os.flush();

final int number = is.readInt();
System.out.println("Total number of files: " + number);
for (int i = 0; i < number; i++) {
final String name = is.readUTF();
final boolean isFolder = is.readBoolean();
final String isFolderString = isFolder ? "is a folder." : "is not a folder.";
System.out.println("\"" + name + "\" " + isFolderString);
}
}

/**
* Downloads file from the server to the file with specified name. If file with
* the given name already exists, FileAlreadyExistsException will be thrown.
*
* @param source target file.
* @param destination path, to save file.
* @throws IOException if any IOException occurred.
*/
public void get(@NotNull final String source, @NotNull final String destination) throws IOException {
os.writeInt(2);
os.writeUTF(source);
os.flush();

final File file = new File(destination);
if (!file.createNewFile()) {
throw new FileAlreadyExistsException();
}
final byte[] buf = new byte[BUF_SIZE];
try (final FileOutputStream os = new FileOutputStream(file)) {
final long size = is.readLong();
int readSize = 0;
int bytesRead;
while (readSize != size) {
bytesRead = is.read(buf);
readSize += bytesRead;
os.write(buf, 0, bytesRead);
}
}
}

private class FileAlreadyExistsException extends RuntimeException {}
}
Loading