Input/Output Zip Files über Socket senden und empfangen

Context

Mitglied
Ich versuche für ein Spiel, dass dann im Browser als Applet läuft, die notwendigen Dateien runterladen zu lassen. Die Dateien kommen an. Haben die richtige Dateigrösse. Jedoch wenn ich eine Datei die sich im ZIP File befindet öffnen will kommt, dass die Datei beschädigt wäre. Wenn ich dann diese Datei als "lib" verwende als die ürsprüngliche wird auch angezeigt, dass irgendwie nichts mehr vorhanden ist. (keine Klassen werden mehr gefunden) Ich konnte die Datei leider nicht anhängen da sie zu gross ist. Der Fehler tritt auch bei ganz kleinen ZIP files auf. Falls dies der falsche Bereich bitte verschieben. Danke.

Java:
public class Main {
	
	public static void main(String[] args) {
		new Thread() {
			public void run() {
				try {
					Server.setup();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}.start();
		
		try {
			Client.start();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
Java:
public class Server {
	
	public static void setup() throws IOException {
		ServerSocket server = new ServerSocket(1001);
		Socket s = server.accept();
		File file = new File("lwjgl.jar");
		BufferedReader reader = new BufferedReader(new FileReader(file));
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		int line = 0;
		while(line!=-1) {
			try {
				line = reader.read();
				if(line!=-1)
					writer.write(line);
			} catch (EOFException e) {
				System.out.println(line);
				e.printStackTrace();
				break;
			}
		}
		writer.flush();
		reader.close();
		writer.close();
		s.close();
		server.close();

	}
}
Java:
public class Client {
	
	public static void start() throws UnknownHostException, IOException {
		Socket s = new Socket("localhost",1001);
		BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
		BufferedWriter writer = new BufferedWriter(new FileWriter(new File("new lwjgl.jar")));
		int line = 0;
		while(line!=-1) {
			line=reader.read();
			if(line!=-1)
				writer.write(line);
		}
		writer.flush();
		writer.close();
		reader.close();
		s.close();
		
		
	}

}

Ich hoffe, dass ihr mir helfen könnt, da ich den Fehler nicht finde.
Ein möglicher Ansatz wäre, wenn ich alle Dateien aus dem ZIP File einzeln lese und verschicke, was ich jedoch nur machen möchte wenn es anders nicht geht.
 
Zuletzt bearbeitet:
Wundert mich ehrlich gesagt nicht, warum das nicht funktioniert. Ein zip-File ist keine Textdatei und du verwendest einen Reader resp. Writer. Diese sind gedacht, um Text zu lesen/schreiben.

Verwende doch einfach ganz normale In-/OutputStream.

So wie hier:

Java:
package datatransfer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;

public class DataTransfer {

  public static void main(String[] args) {
    System.out.println("Start Server");
    Server.startOnce();
    try {
      TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException ex) {
      ex.printStackTrace();
    }
    System.out.println("Start Client");
    Client.start();
  }

}

class Server {

  public static void startOnce() {
    new Thread(() -> {
      try (ServerSocket ss = new ServerSocket(10233);
              InputStream file = Files.newInputStream(Paths.get("lib", "lwjgl.zip"))) {
        Socket s = ss.accept();
        byte[] buffer = new byte[1024];
        try (OutputStream out = s.getOutputStream()) {
          int len;
          while ((len = file.read(buffer)) != -1) {
            out.write(buffer, 0, len);
          }
          out.flush();
        }
        System.out.println("Server finished");
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }).start();
  }
}

class Client {

  public static void start() {
    Path newFile = Paths.get("lib", "new_lwjgl.zip");
    try {
      Files.deleteIfExists(newFile);
      Files.createFile(newFile);
    } catch (IOException ex) {
      ex.printStackTrace();
    }
    try (Socket s = new Socket("localhost", 10233);
            OutputStream out = Files.newOutputStream(newFile)) {
      byte[] buffer = new byte[1024];
      try (InputStream in = s.getInputStream()) {
        int len;
        while ((len = in.read(buffer)) != -1) {
          out.write(buffer, 0, len);
        }
        out.flush();
      }
      System.out.println("Client finished");
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}
 
Zuletzt bearbeitet:
Vielen Dank. Ich habe deinen Code kopiert um ihn zu testen. Ich kann die Dateien nun wie vorgesehen verwenden.
Wenn ich jedoch die Eigenschaften (rechtsklick auf die Datei => Eigenschaften(Windows)) öffne ist die Datei irgendwie grösser als die Ursprungsdatei. Also genau so gross wie "Grösse auf Datenträger". Woran liegt das?
lwjgl.zip:
Grösse: 1'014'790 Bytes
Grösse auf Datenträger: 1'015'808 Bytes

new_lwjgl.zip:
Grösse: 1'015'808 Bytes
Grösse auf Datenträger: 1'015'808 Bytes
 
Vielleicht am längeren Dateinnamen? Die Frage ist ja, ob es jetzt im Gesamten funktioniert oder nicht!?
 
Ohje da hab ich wohl einen Fehler gemacht. Eigentlich sollte man ja dann beim letzten "Abschnitt", der nicht den ganzen Buffer braucht, mit der richtigen Länge übersenden.

Java:
package datatransfer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;

public class DataTransfer {

  public static void main(String[] args) {
    System.out.println("Start Server");
    Server.startOnce();
    try {
      TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException ex) {
      ex.printStackTrace();
    }
    System.out.println("Start Client");
    Client.start();
  }

}

class Server {

  public static void startOnce() {
    new Thread(() -> {
      try (ServerSocket ss = new ServerSocket(10233);
              InputStream file = Files.newInputStream(Paths.get("lib", "lwjgl.zip"))) {
        Socket s = ss.accept();
        byte[] buffer = new byte[1024];
        try (OutputStream out = s.getOutputStream()) {
          int len;
          while ((len = file.read(buffer)) != -1) {
            out.write(buffer, 0, len);
          }
          out.flush();
        }
        System.out.println("Server finished");
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }).start();
  }
}

class Client {

  public static void start() {
    Path newFile = Paths.get("lib", "new_lwjgl.zip");
    try {
      Files.deleteIfExists(newFile);
      Files.createFile(newFile);
    } catch (IOException ex) {
      ex.printStackTrace();
    }
    try (Socket s = new Socket("localhost", 10233);
            OutputStream out = Files.newOutputStream(newFile)) {
      byte[] buffer = new byte[1024];
      try (InputStream in = s.getInputStream()) {
        int len;
        while ((len = in.read(buffer)) != -1) {
          out.write(buffer, 0, len);
        }
        out.flush();
      }
      System.out.println("Client finished");
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}

Also beim lesen sollte man die richtige Länge lesen und diese dann auch richtig rausschreiben:
Java:
int len;
while((len = in.read(buffer)) != -1) {
  out.write(buffer, 0, len);
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben