2 votes

Envoi d'un gros fichier sur un canal TCP avec sérialisation

Je développe un système client-serveur en Java. J'envoie les messages sur un canal TCP avec des objets sérialisés.

Je devrai également envoyer des fichiers. Je pourrais simplement définir ma propre classe de messages personnalisée :

public class SendFile implements Serializable {
    private byte[] fileContents;

    ...
}

et l'envoyer. Cela pose un problème si nous avons un gros fichier, car d'après ce que j'ai compris, il essaiera d'avoir tout en mémoire avant d'envoyer le fichier à l'autre partie.

J'ai lu des articles sur Externalizable mais cela ne sera pas mieux si le fichier est encore lu dans toute la mémoire de mon ordinateur avant d'être envoyé sur le canal TCP. Je voulais une façon "paresseuse" de le faire (en le lisant sur le disque au moment où je l'envoie sur le réseau, et en supprimant de la mémoire ce qui a déjà été lu).

Quelle est la manière la plus propre de traiter cette question ? Dans le pire des cas, je pourrais simplement le diviser en petits morceaux, mais j'aimerais l'éviter si possible.

EDITAR:

Bien sûr, je pourrais simplement ouvrir un flux sur le fichier et "l'envoyer". Mais cela impliquerait de traiter l'envoi d'un fichier et tous les autres messages de manière distincte, ce que je cherche à éviter.

Gracias

2voto

Santosh Points 9794

Une façon de contourner ce problème est d'utiliser streaming . L'approche en streaming ne charge pas l'intégralité du contenu en mémoire. Vous pouvez ouvrir deux flux, flux d'entrée de l'objet à envoyer sur le réseau et flux de sortie pour la connexion du socket TCP.

En java, les deux InputStream y OutputStream . supportent la lecture et l'écriture d'octets.

Vous pouvez définir une taille de tampon (un tableau d'octets). Lisez (à partir d'un fichier) le contenu de ce tampon en utilisant la commande InputStream.read(byte[] b) et écrire (sur la socket TCP) le même tampon sur le flux de sortie en utilisant OutputStream.write(byte[] b)

0voto

ManojGumber Points 1615

Au lieu d'utiliser la sérialisation Java, vous pouvez directement lire le fichier en Java dans un tampon et envoyer ce tampon sur le réseau. Pourquoi impliquer la sérialisation Java en b/w et compliquer les choses. En utilisant un simple programme n/w, vous serez en mesure d'envoyer vos fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X