main
Brett 2023-11-11 22:52:33 -05:00
parent a6e42a8934
commit 3ba1c8a9f0
6 changed files with 90 additions and 18 deletions

1
ihaveafile.txt Normal file
View File

@ -0,0 +1 @@
this is a test file which i can check for errors with

0
out-ihaveafile.txt Normal file
View File

View File

@ -1,11 +1,59 @@
package client;
import server.Server;
import shared.FileHeader;
import java.io.*;
import java.net.Socket;
public class Client {
public static class ClientInvalidUsageException extends RuntimeException {
public ClientInvalidUsageException(String str){
super(str);
}
}
private final Socket serverConnection;
private final DataOutputStream out;
private final DataInputStream in;
public Client(String address, int port) throws IOException {
serverConnection = new Socket(address, port);
out = new DataOutputStream(new BufferedOutputStream(serverConnection.getOutputStream()));
in = new DataInputStream(new BufferedInputStream(serverConnection.getInputStream()));
}
void sendFile(String path){
if (new File(path).isDirectory())
throw new ClientInvalidUsageException("Unable to send directory. Did you mean sendDir()?");
System.out.println("Sending path " + path);
new FileHeader(path).write(out);
try {
out.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
void sendDir(String path){
}
void close(){
try {
in.close();
out.close();
serverConnection.close();
} catch (Exception ignored){}
}
public static void main(String[] args) {
try {
new Client("localhost", Server.SERVER_PORT).sendFile("ihaveafile.txt");
} catch (Exception e){
e.printStackTrace();
}
}
}

View File

@ -1,24 +1,23 @@
package server;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import shared.FileHeader;
import java.io.*;
import java.net.Socket;
public class Connection extends Thread {
private final Socket clientSocket;
private final Server server;
private BufferedWriter out;
private BufferedReader in;
private DataOutputStream out;
private DataInputStream in;
public Connection(Server server, Socket clientSocket) {
this.server = server;
this.clientSocket = clientSocket;
try {
out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));
in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
} catch (Exception ignored) {
}
}
@ -26,7 +25,18 @@ public class Connection extends Thread {
@Override
public void run() {
while (server.isRunning()) {
if (!clientSocket.isConnected())
break;
try {
if (in.available() > 0) {
byte command = in.readByte();
if (command == FileHeader.COMMAND.WRITE.type)
FileHeader.receive(in);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
try {
out.close();

View File

@ -25,7 +25,7 @@ public class Server {
}
public boolean isRunning(){
return isRunning();
return running;
}
public static void main(String[] args) {

View File

@ -1,5 +1,7 @@
package shared;
import client.Client;
import java.io.*;
public class FileHeader {
@ -8,9 +10,9 @@ public class FileHeader {
public enum COMMAND {
WRITE((byte) 1);
private final byte type;
public final byte type;
private COMMAND(byte type) {
COMMAND(byte type) {
this.type = type;
}
}
@ -19,18 +21,22 @@ public class FileHeader {
private final String full_path;
public FileHeader(String path) {
File pf = new File(path);
if (!pf.exists())
throw new Client.ClientInvalidUsageException("Unable to send a file which doesn't exist!");
if (pf.isDirectory())
throw new Client.ClientInvalidUsageException("Path is a directory unable to send!");
String workingDirectory = System.getProperty("user.dir");
this.full_path = path;
this.relative_path = path.replace(workingDirectory, "");
System.out.println(relative_path);
this.size = 0;
}
void write(DataOutputStream writer) {
public void write(DataOutputStream writer) {
try {
DataInputStream reader = new DataInputStream(new BufferedInputStream(new FileInputStream(full_path)));
writer.write(COMMAND.WRITE.type);
writer.writeByte(COMMAND.WRITE.type);
writer.writeUTF(relative_path);
while (reader.available() > 0) {
@ -38,18 +44,25 @@ public class FileHeader {
byte[] bytes = new byte[read];
int amount = reader.read(bytes);
if (amount <= 0)
break;
System.out.println("Writing " + amount + " bytes");
writer.writeInt(amount);
writer.write(bytes, 0, amount);
}
reader.close();
writer.writeInt(0);
writer.flush();
} catch (Exception ignored) {
}
}
void receive(DataInputStream reader) {
public static void receive(DataInputStream reader) {
try {
String relative = reader.readUTF();
DataOutputStream writer = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(relative)));
String path = System.getProperty("user.dir") + "/out-" + reader.readUTF();
System.out.println("Writing to file: " + path);
DataOutputStream writer = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path)));
int size = 0;
while ((size = reader.readInt()) > 0){
byte[] data = new byte[size];