Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    invio di più file client/server

    ciao ragazzi,
    non vorrei approfittarne, ma siete molto bravi a risolvere i miei problemi, quindi...

    vi chiedo di nuovo aiuto...

    devo inviare dei file dal server al client.

    sono riuscito ad inviare un singolo file, ma non riesco ad inviare più file...

    vi posto adesso il codice del client e del server:

    IL SERVER:

    codice:
    import java.io.*;
    import java.net.*;
    
    public class Server_monitor_1 extends Thread
    {
    	
    	private ServerSocket Server_monitor;
    	
    	 public static void main( String arg[] ) throws Exception
    	 {
    		 new Server_monitor_1();
    	 }
    	 
    	 public Server_monitor_1() throws Exception
    	 {
    		 Server_monitor = new ServerSocket(50001);
    		 System.out.println("Il Server è in attesa sulla porta 50001.");
    		 this.start();
    	 }
    	 
    	 public void run()
    	 {
    		 while(true)
    		 {
    			 try 
    			 {
    				 System.out.println("In attesa di Connessione.");
    				 Socket client = Server_monitor.accept();
    				 System.out.println("Connessione accettata da: "+
    				 client.getInetAddress());
    				 @SuppressWarnings("unused")
    				Connect c = new Connect(client);
    			 }
    			 catch(Exception e) {}
    		 }
    	 }
    }
    
    class Connect extends Thread
    {
    	private Socket client = null;
    	BufferedReader in = null;
    	PrintStream out = null;
    	
    	public Connect() {}
    	
    	public Connect(Socket clientSocket)
    	{
    		client = clientSocket;
    		try
    		{
    			in = new BufferedReader(
    			new InputStreamReader(client.getInputStream()));
    			out = new PrintStream(client.getOutputStream(), true);
    		}
    		catch(Exception e1)
    		{
    			try { client.close(); }
    			catch(Exception e) { System.out.println(e.getMessage());}
    			return;
    		}
    		this.start();
    	}
    	public void run()
    	{
    		try 
    		{
    			String path_dir = "c:\\fileRicevuti\\";
    		//devo scannerizzare tutta la cartella e ad uno ad uno inviare tutti i file
    			File dir = new File(path_dir);
    			File elenco_file[] = dir.listFiles();
    			
    			for(int i=0; i<elenco_file.length; i++)
    			{
                            //qui riesce a leggere il primo file, ma poi si ferma e non legge il secondo
    				File file = new File(path_dir+elenco_file[i].getName());
    				System.out.println(file.getName());
    				sendFile(file, client);
    			}
    			
    			    
    		} 
    			catch( IOException e ) 
    			{
    			   System.out.println( "Si è verificato un errore!" );
    			}
    			
    	}
    	
    	private static void sendFile(File f, Socket clientSocket) throws IOException
    	{
    	  Socket s=clientSocket;
    	  
    	  BufferedOutputStream out = new BufferedOutputStream(s.getOutputStream());
    	  DataOutputStream dataOut = new DataOutputStream(s.getOutputStream());
    	  dataOut.writeUTF(f.getName());
    	  BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
    	  
    	  byte buffer[] = new byte[4096];
    	  long totale = 0L;
    	  
    	  System.out.println( "Invio file in corso..." );
    	  while( true ) {
    	   try {
    	    int letti = in.read(buffer);
    	    if( letti>0 ) {
    	     out.write( buffer,0,letti );
    	     totale += letti;
    	    } else {
    	     break;
    	    }
    	   } catch( IOException e ) {
    	    break;
    	   }
    	  }
    	  in.close();
    	  out.flush();
    	  out.close();
    	  s.close();
    	  
    	  System.out.println( "Invio file terminato [" + totale + " bytes inviati]" );
    	 }
    }

    IL CLIENT:

    codice:
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.Socket;
    import gui.*;
    
    
    public class Client_monitor
    {
    	public static void main(String[]args)
    	{
    		GUI myGui = new GUI();
    		myGui.setVisible(true);
    	}
    
    	public void ricevi_file(int server_id, String ip_address, int porta_server) throws IOException
    	{
    		Socket s = new Socket(ip_address, porta_server);
    		
    		System.out.println( "Ricezione file in corso dal server "+server_id+"..." );
    		
    		BufferedInputStream in = new BufferedInputStream(s.getInputStream());
    		DataInputStream dataIn = new DataInputStream(s.getInputStream());
    		String fileReceived = dataIn.readUTF();
    		BufferedOutputStream out = new BufferedOutputStream( new    FileOutputStream(new File(la cartella di destinazione + fileReceived);
    		
    		byte buffer[] = new byte[4096];
    		int letti;
    		  
    		  while( true ) 
    		  {
    		   letti = in.read(buffer);
    		   if( letti>0 ) {
    		    out.write( buffer,0,letti );
    		   } else {
    		    break;
    		   }
    		  }
    		  
    		  out.flush();
    		  out.close();
    		  in.close();
    		  s.close();
    		  System.out.println( "Ricezione completata dal server "+server_id+"!" );
    	}
    }

    avvio il server normalmente, e parte.
    poi faccio partire il client..parte, si collega al server, ma riceve soltanto il primo file della cartella del server (in realtà invece sono 3 file).

    perchè ragazzi?
    dove sbaglio?

    forse non dovrei chiudere la socket (s.close), o qualcosa del genere?

    aiutatemi per favore.

    grazie

  2. #2
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537

    Re: invio di più file client/server

    Originariamente inviato da buruliddu
    ciao ragazzi,
    non vorrei approfittarne, ma siete molto bravi a risolvere i miei problemi, quindi...

    vi chiedo di nuovo aiuto..

    perchè ragazzi?
    dove sbaglio?

    forse non dovrei chiudere la socket (s.close), o qualcosa del genere?

    aiutatemi per favore.

    grazie
    Ma sei bravissimo a farti una domanda e risponderti da solo....
    Se hai questo dubbio prova.
    Non che io non ti voglia aiutare, ma anzi, hai dimostrato di avere un buon intuito....
    Sapresti anche dirmi il perchè non devi chiudere la connessione? E' logico....Non credi
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  3. #3
    ciao,
    ma ho provato a commentare la parte in cui chiudo la spcket
    (s.close()), sia sul server che sul client, ma il problema è sempre lo stesso.

    mi trasferisce solo il primo file.
    al secondo file si blocca.

    aiuuutooo

  4. #4
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    codice:
    while( true ) {
     try {
      int letti = in.read(buffer);
        if( letti>0 ) {
    	     out.write( buffer,0,letti );
    	     totale += letti;
    	    } else {
    	     break;
    	    }
    	   } catch( IOException e ) {
    	    break;
    	   }
    	  }
    .....Innanzitutto.....try{}catch non si blocca con un break!! Non si deve soffocare in quel modo, ma anzi un'exception serve a vedere il perchè ve in errore, con comandi tel tipo e.getMessage(), oppure e.printStackTrace() <- meglio questo.

    Sostituisci con questo
    codice:
    while( ( letti = in.read( buffer ) ) != -1 )
         out.write( buffer , 0 , letti );
    Meglio non credi.
    codice:
    			for(int i=0; i<elenco_file.length; i++)
    			{
                            //qui riesce a leggere il primo file, ma poi si ferma e non legge il secondo
    				File file = new File(path_dir+elenco_file[i].getName());
    				System.out.println(file.getName());
    				sendFile(file, client);
    			}
    Sempre per renderlo leggibile
    codice:
    for( int i = 0; i < elenco_file.length; i++ ){
         System.out.println( elenco_file[i].getName() );
         sendFile( elenco_file[i] , client );
    }
    Ora fai queste modifiche e probabilmente se c'è un errore stavolta e.printStackTrace() ti dirà di cosa si tratta, semmai postalo.

    Una domanda, ma l'unico file che legge, almeno te lo manda giusto??

    EDIT: Mi sono limitato a leggere il server.
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  5. #5
    ciao,
    ho sostituito, ma mi da questo errore:

    codice:
    java.net.SocketException: Socket is closed
    	at java.net.Socket.getOutputStream(Unknown Source)
    	at Connect.sendFile(Server_monitor_1.java:89)
    	at Connect.run(Server_monitor_1.java:75)
    mi dice che la socket è chiusa...

    ho provato a commentare la parte in cui chiudo la socket, ma niente.

    codice:
              in.close();
    	  out.flush();
    	  out.close();
    	  //s.close();
    PERCHè?

  6. #6
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    Tra un'oretta circa sono a casa.
    Se nessuno ti ha dato risposta sino ad allora mi faccio vivo.
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  7. #7
    ok grazie.

    se invece commento .
    out.close(), mi entra in un ciclo infinito, e l'applicazione non termina.

    aspetto con ansia il tuo ritorno a casa.
    hehehe

    grazie

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non è sufficiente "commentare la chiusura della socket"... semplicemente non devi chiudere nessun canale (input o output).

    La socket ha due canali: uno di unput e uno di output.
    Se chiudi la socket, chiudi entrambi i canali.
    Se chiudi uno degli oggetti che si interfacciano ad un canale (siano essi ObjectInputStream, DataInputStream, o quel che vuoi), il canale relativo verrà chiuso.

    Quindi devi togliere la chiusura anche di "in" e "out".

    Il fatto che vada in loop è dovuto a qualche errore concettuale nella progettazione, ma rimane il fatto che i canali non vanno chiusi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Io, sinceramente, costruirei qualcosa del genere, per evitare troppi problemi:

    Lato server (pseudo-codice):

    codice:
    private void sendFiles(File[] elenco) {
       // Comunica al client il numero di file che invierò
       int numeroFile = elenco.length;
       sendClient( numeroFile );
    
       // Ora invia ciascun file, uno per volta:
       for(int i=0; i<elenco.length; i++) {
          FileInputStream fis = new FileInputStream( elenco[i] );
    
          // Comunica al client la dimensione del file che verrà inviato
          sendClient( fis.available() );
    
          // Invia il file a blocchi di 4096 byte (4 KB)
          byte[] dati = new byte[4096];
          while(fis.available() > 0) {
             int numByteEffettivi = fis.read( dati );
             sendClient(dati, numByteEffettivi);
          }
    
          // Chiudo il file
          fis.close();
       }
    }
    Lato client (pseudo-codice):

    codice:
    private void receiveFiles() {
       // Leggo dal server il numero di file che riceverò
       int numFiles = receiveFromServer();
    
       // Ora ricevo ciascun file
       for(int i=0; i<numFiles; i++) {
    
          // Ricevo dal server la dimensione del file
          int dimFile = receiveFromServer();
    
          // Ricevo, a pacchetti di 4096 byte (4 KB), tutto il file
          byte[] dati = new byte[4096];
          FileOutputStream fos = new FileOutputStream( ... );
          dim byteLetti = 0;
          while(byteLetti < dimFile) {
             byteRicevuti = receiveFromServer( dati );
             fos.write(dati, 0, byteRicevuti);
             byteLetti += byteRicevuti;
          }
    
          // Chiudo il file
          fos.close();
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    ho provato anche così...

    adesso non si blocca dopo il primo file...(i file sono 3: doc1.txt, doc2.txt, doc3.txt).

    però il client riceve solo il primo file (doc1.txt), e dentro scrive i nomi degli altri file....

    ma come può succedere una cosa del genere..
    ci sto impazzendo..
    sarà sicuramente una cavolata, e non riesco a capirlo.

    aiutoo ragazzi

    SERVER:

    codice:
    import java.io.*;
    import java.net.*;
    
    public class Server_monitor_1 extends Thread
    {
    	
    	private ServerSocket Server_monitor;
    	
    	 public static void main( String arg[] ) throws Exception
    	 {
    		 new Server_monitor_1();
    	 }
    	 
    	 public Server_monitor_1() throws Exception
    	 {
    		 Server_monitor = new ServerSocket(50001);
    		 System.out.println("Il Server è in attesa sulla porta 50001.");
    		 this.start();
    	 }
    	 
    	 public void run()
    	 {
    		 while(true)
    		 {
    			 try 
    			 {
    				 System.out.println("In attesa di Connessione.");
    				 Socket client = Server_monitor.accept();
    				 System.out.println("Connessione accettata da: "+
    				 client.getInetAddress());
    				 @SuppressWarnings("unused")
    				Connect c = new Connect(client);
    			 }
    			 catch(Exception e) {}
    		 }
    	 }
    }
    
    class Connect extends Thread
    {
    	private Socket client = null;
    	BufferedReader in = null;
    	PrintStream out = null;
    	
    	public Connect() {}
    	
    	public Connect(Socket clientSocket)
    	{
    		client = clientSocket;
    		try
    		{
    			in = new BufferedReader(
    			new InputStreamReader(client.getInputStream()));
    			out = new PrintStream(client.getOutputStream(), true);
    		}
    		catch(Exception e1)
    		{
    			try { client.close(); }
    			catch(Exception e) { System.out.println(e.getMessage());}
    			return;
    		}
    		this.start();
    	}
    	public void run()
    	{
    		try 
    		{
    			String path_dir = "path della cartella dei file";
    		//devo scannerizzare tutta la cartella e ad uno ad uno inviare tutti i file
    			File dir = new File(path_dir);
    			File elenco_file[] = dir.listFiles();
    			
    			sendFile(elenco_file, client);
    		} 
    			catch( IOException e ) 
    			{
    			   System.out.println( "Si è verificato un errore!" );
    			   e.printStackTrace();
    			}
    	}
    	
    	private static void sendFile(File[] elenco, Socket clientSocket) throws IOException
    	{
    		Socket s=clientSocket;
    		
    		// Comunica al client il numero di file che invierò
    		int numeroFile = elenco.length;
    		sendClient(numeroFile, s);
    	  
    		// Ora invia ciascun file, uno per volta:
    		   for(int i=0; i<elenco.length; i++) 
    		   {
    			  BufferedInputStream in = new BufferedInputStream(new  FileInputStream(elenco[i]));
    		      BufferedOutputStream out = new BufferedOutputStream(s.getOutputStream());
    
    		      // Comunica al client la dimensione del file che verrà inviato ed il nome del file
    		      sendClient(in.available(), elenco[i], s);
    
    		      // Invia il file a blocchi di 4096 byte (4 KB)
    		      byte[] dati = new byte[4096];
    		      System.out.println( "Invio file in corso..." );
    		      int letti;
    			  
    				while( ( letti = in.read( dati ) ) != -1 ) 
    				{
    				   try 
    				   {
    				       out.write( dati , 0 , letti );
    				   } 
    				   catch( IOException e ) 
    				   {
    					   e.printStackTrace();
    				   }
    				}
    		      System.out.println( "Invio file terminato" );
    		   }
    	}

    CLIENT:

    codice:
    public void ricevi_file(int server_id, String ip_address, int porta_server) throws IOException
    	{
    		Socket s = new Socket(ip_address, porta_server);
    		
    		System.out.println( "Ricezione file in corso dal server "+server_id+"..." );
    		
    		// Leggo dal server il numero di file che riceverò
    		   int numFiles = receiveFromServer("nFile", s);
    		   System.out.println("IL CLIENT DEVE RICEVERE "+numFiles+" FILE");
    
    		   // Ora ricevo ciascun file
    		   for(int i=0; i<numFiles; i++) 
    		   {
    		      // Ricevo dal server la dimensione del file
    		      int dimFile = receiveFromServer("dimFile", s);
    		      System.out.println("DIM FILE RICEVUTO: "+dimFile);
    		      
    		      BufferedInputStream in = new BufferedInputStream(s.getInputStream());;
    		      DataInputStream dataIn = new DataInputStream(s.getInputStream());
    		      String fileReceived = dataIn.readUTF();
    		      System.out.println("NOME FILE RICEVUTO: "+fileReceived);
    		      FileOutputStream fos = new FileOutputStream( new File("D:\\fileRicevuti\\"+fileReceived));
    		      
    		      // Ricevo, a pacchetti di 4096 byte (4 KB), tutto il file
    		      	byte[] dati = new byte[4096];
    		      	int letti;
    				  
    				while( ( letti = in.read( dati ) ) != -1 ) 
    				{
    				   try 
    				   {
    				        fos.write( dati , 0 , letti );
    				   } 
    				   catch( IOException e ) 
    				   {
    					   e.printStackTrace();
    				   }
    				}
    				fos.close();
    				in.close();
    				System.out.println( "Ricezione completata dal server "+server_id+"!" );
    		   }
    	}

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.