2011-02-17 2 views
2

Je souhaite créer un programme client-serveur permettant au client d'envoyer un fichier au serveur avec des informations sur le fichier (nom de l'expéditeur, description, etc.). Le fichier peut potentiellement être assez volumineux car il peut s'agir d'un fichier texte, image, audio ou vidéo, et à cause de cela je ne veux pas avoir à lire le fichier entier dans un tableau d'octets avant d'envoyer, je le ferais lisez plutôt le fichier en blocs, en les envoyant sur le réseau et en permettant au serveur d'ajouter les blocs au fichier à la fin.Envoi de fichier avec des attributs personnalisés sur un réseau

Cependant, je suis confronté au problème de la meilleure façon d'envoyer le fichier avec quelques informations sur le fichier lui-même. Je souhaiterais au minimum envoyer le nom de l'expéditeur et une description qui seront tous deux saisis par l'utilisateur dans le programme client, mais cela pourrait changer dans le futur et devrait donc être flexible.

Quelle est une bonne façon de faire cela qui me permettrait également de "streamer" le fichier envoyé plutôt que de le lire dans son ensemble, puis d'envoyer?

+0

Parlez-vous d'une application Web? Si vous exécutez une application Web, pourquoi n'utilisez-vous pas HTTP POST pour envoyer des fichiers et des paramètres? Oui, vous pouvez envoyer du contenu en continu à votre application Web. – gigadot

+0

@gigadot les applications client et serveur et Swing s'exécutant sur les ordinateurs de bureau. – Bassetts

Répondre

2

Les sockets sont nativement des flux d'octets, donc vous ne devriez pas avoir de problème là-bas. Je suggère que vous ayez un protocole qui ressemble à ceci.

Cela vous permettra d'envoyer des propriétés arbitraires tant que la longueur totale est inférieure à 64 Ko. Suivi par le fichier qui peut être n'importe quelle longueur de 63 bits et est envoyé un bloc à la fois. (avec un tampon de 8 Ko)

Le Socket peut être utilisé pour envoyer plus de fichiers si vous le souhaitez.

DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
Properties fileProperties = new Properties(); 
File file = new File(filename); 

// send the properties 
StringWriter writer = new StringWriter(); 
fileProperties.store(writer, ""); 
writer.close(); 
dos.writeUTF(writer.toString()); 

// send the length of the file 
dos.writeLong(file.length()); 

// send the file. 
byte[] bytes = new byte[8*1024]; 
FileInputStream fis = new FileInputStream(file); 
int len; 
while((len = fis.read(bytes))>0) { 
    dos.write(bytes, 0, len); 
} 
fis.close(); 
dos.flush(); 

lire

DataInputStream dis = new DataInputStream(socket.getInputStream()); 
String propertiesText = dis.readUTF(); 
Properties properties = new Properties(); 
properties.load(new StringReader(propertiesText)); 
long lengthRemaining = dis.readLong(); 
FileOutputStream fos = new FileOutputStream(outFilename); 
int len; 
while(lengthRemaining > 0 
    && (len = dis.read(bytes,0, (int) Math.min(bytes.length, lengthRemaining))) > 0) { 
     fos.write(bytes, 0, len); 
     lengthRemaining -= len; 
} 
fos.close(); 
+0

Merci, c'était le genre de chose que je pensais, je ne savais pas comment la réception recevrait le transfert. Seriez-vous capable de fournir un exemple de code pour cela? – Bassetts

+0

C'est à peu près la même chose. Ajout quand même. –

+0

Cela a du sens, merci. – Bassetts

0

Vous pouvez construire le programme autour d'un protocole bien connu comme FTP. Et pour envoyer les méta-informations, vous pouvez simplement créer un fichier spécial avec un nom unique contenant les informations. Transférez ensuite le fichier utilisateur et le fichier méta avec FTP. Sinon, en utilisant à nouveau FTP pour le fichier, vous pouvez transférer les métadonnées dans le flux client-serveur de votre programme écrit à la main.

0

Je recommande d'utiliser le protocole http pour cela. Le serveur peut être implémenté à l'aide d'une servlet et Apache HttpClient peut être utilisé pour le client. This article a quelques bons exemples. Vous pouvez envoyer le fichier et les paramètres dans la même requête. Et cela aussi avec très peu de code!

+0

Merci, est-il possible d'utiliser cette méthode sans servlet? Les deux applications sont destinées à être utilisées sur des machines de bureau standard – Bassetts

Questions connexes