Heim >Java >javaLernprogramm >Wie übertrage ich Dateien korrekt über Sockets in Java?

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

Susan Sarandon
Susan SarandonOriginal
2024-11-03 13:59:31321Durchsuche

How to Correctly Transfer Files Over Sockets in Java?

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

In Java umfasst das Übertragen von Dateien über Sockets das Konvertieren 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:

<code class="java">byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}</code>

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:

<code class="java">FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);</code>

Verbesserter Code

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

Server:

<code class="java">...
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();
...</code>

Client:

<code class="java">...
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);
...</code>

Das obige ist der detaillierte Inhalt vonWie übertrage ich Dateien korrekt über Sockets in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn