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);
...
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