Maison  >  Article  >  Java  >  Comment transférer correctement des fichiers via des sockets en Java ?

Comment transférer correctement des fichiers via des sockets en Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-03 13:59:31270parcourir

How to Correctly Transfer Files Over Sockets in Java?

Transfert de fichiers Java sur sockets : envoi et réception de tableaux d'octets

En Java, le transfert de fichiers via des sockets implique la conversion du fichier en tableaux d'octets, les envoyer via le socket, puis reconvertir les octets en un fichier à la réception. Cet article résout un problème rencontré par un développeur Java lors de la mise en œuvre de cette fonctionnalité de transfert de fichiers.

Problème côté serveur

Le code du serveur semble créer un fichier vide lors de la réception données du client. Pour résoudre ce problème, le serveur doit utiliser une boucle pour lire les données envoyées par le client par morceaux, en utilisant un tampon pour stocker temporairement les données. Une fois toutes les données reçues, le serveur peut écrire le fichier complet. Le code serveur corrigé est le suivant :

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

Problème côté client

Le code client envoie initialement un tableau d'octets vide au serveur. Pour envoyer le contenu réel du fichier, le code suivant doit être utilisé :

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

Code amélioré

Avec les corrections susmentionnées, le code complet du serveur et du client est comme suit :

Serveur :

<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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn