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 l'implémentation 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 :
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
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é :
FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
Code amélioré
Avec les corrections susmentionnées, le code complet pour le serveur et le client est le suivant :
Serveur:
...
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();
...
Client:
...
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);
...
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3