„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie übertrage ich Dateien korrekt über Sockets in Java?

Wie übertrage ich Dateien korrekt über Sockets in Java?

Veröffentlicht am 17.11.2024
Durchsuche:462

How to Correctly Transfer Files Over Sockets in Java?

Java-Dateiübertragung über Sockets: Senden und Empfangen von Byte-Arrays

In Java umfasst die Übertragung von Dateien über Sockets die Konvertierung der Datei in Byte-Arrays. Senden Sie sie über den Socket und konvertieren Sie die Bytes dann auf der Empfängerseite wieder in eine Datei. In diesem Artikel wird ein Problem behandelt, auf das ein Java-Entwickler bei der Implementierung dieser Dateiübertragungsfunktion gestoßen ist.

Serverseitiges Problem

Der Servercode scheint beim Empfang eine leere Datei zu erstellen Daten vom Kunden. Um dieses Problem zu lösen, sollte der Server eine Schleife verwenden, um die vom Client gesendeten Daten in Blöcken zu lesen und einen Puffer zum vorübergehenden Speichern der Daten verwenden. Sobald alle Daten empfangen wurden, kann der Server die komplette Datei schreiben. Der korrigierte Servercode lautet wie folgt:

byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}

Clientseitiges Problem

Der Clientcode sendet zunächst ein leeres Byte-Array an den Server. Um den eigentlichen Dateiinhalt zu senden, sollte der folgende Code verwendet werden:

FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);

Verbesserter Code

Mit den oben genannten Korrekturen lautet der vollständige Code für Server und Client wie folgt:

Server:

...
byte[] buffer = new byte[1024];
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

FileOutputStream fos = new FileOutputStream("C:\\test2.xml");
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}
fos.close();
...

Kunde:

...
Socket socket = new Socket(host, 4444);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

File file = new File("C:\\test.xml");
FileInputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
    System.out.println("File is too large.");
}
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
...
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3