2011-10-08 6 views
3

J'ai utilisé le concept de socket serveur dans java pour transférer des fichiers comme des images et des vidéos. Mais quand je reçois du côté client, je personnalise les noms de fichiers. Puis-je obtenir le nom d'origine du fichier tel quel?Transfert de fichiers de socket serveur

Par exemple:

Si le fichier de fin du serveur pour le transfert est « abc.txt », j'ai besoin ce même nom se refléter dans la fin du client (sans passer le nom séparément).

En fin de serveur:

public class FileServer { 
    public static void main (String [] args) throws Exception { 
    // create socket 
    ServerSocket servsock = new ServerSocket(13267); 
    while (true) { 
     System.out.println("Waiting..."); 

     Socket sock = servsock.accept(); 
     System.out.println("Accepted connection : " + sock); 
     OutputStream os = sock.getOutputStream(); 
    new FileServer().send(os); 
     sock.close(); 
     } 
    } 

    public void send(OutputStream os) throws Exception{ 
     // sendfile 
     File myFile = new File ("C:\\User\\Documents\\abc.png"); 
     byte [] mybytearray = new byte [(int)myFile.length()+1]; 
     FileInputStream fis = new FileInputStream(myFile); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     bis.read(mybytearray,0,mybytearray.length); 
     System.out.println("Sending..."); 
     os.write(mybytearray,0,mybytearray.length); 
     os.flush(); 
    } 
} 

En fin de compte client:

public class FileClient{ 
    public static void main (String [] args) throws Exception { 


    long start = System.currentTimeMillis(); 


    // localhost for testing 
    Socket sock = new Socket("127.0.0.1",13267); 
    System.out.println("Connecting..."); 
    InputStream is = sock.getInputStream(); 
    // receive file 
    new FileClient().receiveFile(is); 
     long end = System.currentTimeMillis(); 
    System.out.println(end-start); 

    sock.close(); 
    } 

    public void receiveFile(InputStream is) throws Exception{ 
     int filesize=6022386; 
     int bytesRead; 
     int current = 0; 
     byte [] mybytearray = new byte [filesize]; 

     FileOutputStream fos = new FileOutputStream("def"); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 
     bytesRead = is.read(mybytearray,0,mybytearray.length); 
     current = bytesRead; 


     do { 
      bytesRead = 
       is.read(mybytearray, current, (mybytearray.length-current)); 
      if(bytesRead >= 0) current += bytesRead; 
     } while(bytesRead > -1); 

     bos.write(mybytearray, 0 , current); 
     bos.flush(); 
     bos.close(); 
    } 
} 

Répondre

2

Oui, il vous suffit de transférer les métadonnées (dans votre cas, myFile.getName()) avant le contenu du fichier, et de permettre au client et au serveur de lire et d'émettre ces métadonnées. C'est une bonne idée d'utiliser des protocoles établis, par exemple HTTP et son en-tête Content-Disposition.

+0

Mais la chose est que j'important un tableau de fichiers comme ça au client. Impossible d'ajouter le nom du fichier au tableau d'octets du fichier. Si oui, dites-moi s'il vous plaît comment le faire. – Arun

+0

@Arun Bien sûr, vous avez juste besoin de concevoir un protocole. Quelle méthode/protocole de sérialisation utilisez-vous? Y compris le code qui envoie ou reçoit réellement les fichiers (<15 lignes) dans la question serait d'une grande aide. – phihag

+0

J'ai édité ma question avec le code source complet. Ceci est en fait tiré des liens postés dans cette question. Merci de m'aider. Désolé pour la réponse tardive. – Arun

4

Pour le récepteur de connaître le nom de fichier, soit:

a) il doit l'assumer connaît le nom parce qu'il l'a demandé,

b) le serveur envoie le nom d'abord comme partie du flux.

Si vous inventez un moyen d'envoyer des informations sans les envoyer, faites le moi savoir et nous pouvons devenir des milliardaires. Nous pouvons l'appeler «télépathie informatique».

+0

J'envoie un fichier en tant que tableau d'octets au client. S'il vous plaît essayez une chose ... est-ce qu'elle contiendra le nom du fichier ou pas? – Arun

+0

Il contiendra le nom si vous envoyez le nom, sinon il est peu probable que le fichier contienne son propre nom. –

1

Il existe une façon plus simple de le faire. Juste enveloppez votre flux d'entrée dans DataInputStream et utilisez des méthodes comme .writeUTF (myFile.getName()). De même, vous pouvez lire le nom du fichier sur le récepteur en appliquant .readUTF sur DataInputStream. Voici un exemple de code: Auteur:

FileInputStream fis = new FileInputStream(myFile); 
    BufferedInputStream bis = new BufferedInputStream(fis); 
    DataInputStream dis = new DataInputStream(bis); 
    OutputStream os; 
    try { 
     os = socket.getOutputStream(); 
     DataOutputStream dos = new DataOutputStream(os); 
     dos.writeUTF(myFile.getName()); 
.............////// catch exceptions 

Récepteur:

InputStream in; 
    try { 
     bufferSize=socket.getReceiveBufferSize(); 
     in=socket.getInputStream(); 
     DataInputStream clientData = new DataInputStream(in); 
     String fileName = clientData.readUTF(); 
     System.out.println(fileName); 
................../////// catch exceptions 
Questions connexes