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!