Maison > Java > javaDidacticiel > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-03 13:59:31
original
273 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal