Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14

    [Java] Problema invio file

    Ciao a tutti!!!
    Ho un problema paradossale, per fare un programma sto utilizzando parte di codice di un programma che ho fatto l'anno scorso (funzionante) ma il problema è che per "magia" non va più.
    Devo inviare semplicemente un file da client a server e viceversa.
    Per comodità (più corto e tutto in un file) vi incollo il codice di un programmino fatto dal mio prof, che ho utilizzato l'anno scorso (ho utilizzato le sue classi sendFile e getFile).

    PARTE SERVER
    codice:
    import java.io.*;
    import java.net.*;
    import java.util.*;
    import javax.swing.*;
    import java.io.ObjectOutputStream;
    
    public class MediaServer
    {
      private static ServerSocket serverSocket;
      private static final int PORT = 7777;
    
      public static void main(String[] args)
      	{
         
        System.out.println(">>> Pronto al servizio <<<\n");
    
        try
        {
          serverSocket = new ServerSocket(PORT);
        }
        catch(IOException ioEx)
        {
          System.out.println(">>> Impossibile agganciare la porta! <<<");
          System.exit(1);
        }
    
        do
        {
          try
          {
            Socket link = serverSocket.accept();
            System.out.println("Accepted connection : " + link);
    
            Scanner inStream = new Scanner(link.getInputStream());		// crea un oggetto scanner e lo associa allo stream di input del socket connesso al client
    
    
            ObjectOutputStream outStream = new ObjectOutputStream(link.getOutputStream());		// crea un oggetto ObjectOutputStream associato all'oggetto Socket
    
    
            String message = inStream.nextLine();			// acquisisce il messaggio
    
    
            if (message.equals("IMAGE"))						// chiama metodo sendFile a seconda del tipo di file passando nome file e oggetto ObjectOutputStream
              sendFile("./DATABASE/immagine.jpg", outStream);	
            if (message.equals("SOUND"))
              sendFile("./DATABASE/canzone.mp3", outStream);
          }
    
          catch(IOException ioEx)			// cattura eccezioni IO
          {
            ioEx.printStackTrace();
          }
        }while (true);
      }
      
    
      private static void sendFile(String fileName, ObjectOutputStream outStream) 
            throws IOException
      {
    
        FileInputStream fileIn = new FileInputStream(fileName);			// crea un oggetto FileInputStream passandogli il nome del file nel costruttore
    
        long fileLen =  (new File(fileName)).length();		// crea un oggetto File anonimo (non verra' piu' usato dal nome del file e usa metodo length per determinarne la lunghezza
    
        int intFileLen = (int)fileLen;		// converte log a int e dichiara un array di byte di questa lunghezza
        byte[] byteArray = new byte[intFileLen];
    
        fileIn.read(byteArray);		// usa metodo read di FileInputStream per leggere il contenuto del FileInputStream nello array di byte
    
        fileIn.close();			// chiude alla fine
    
        outStream.writeObject(byteArray);		// utilizza oggetto ObjectOutputStream per spedire array di byte al client
        outStream.flush();
      }
    }
    PARTE CLIENT
    codice:
    import java.io.*;
    import java.net.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.*;
    import java.io.ObjectOutputStream;
    
    
    public class MediaClient
    {
      private static InetAddress host;
      private static final int PORT = 7777;
    
      public static void main(String[] args)
      {
        try
        {
          host = InetAddress.getLocalHost();
        }
        catch(UnknownHostException uhEx)
        {
          System.out.println(">>> Non trovato host ID! <<<");
          System.exit(1);
        }
    
        try
        {
          Socket link = new Socket(host,PORT);
    
    // crea oggetti ObjectInputStream e PrintWriter associandoli al socket
          ObjectInputStream inStream = new ObjectInputStream(
                          link.getInputStream());
    
          PrintWriter outStream = new PrintWriter(
                link.getOutputStream(),true);
    
    // definisce stream per ingresso da tastiera
          Scanner userEntry = new Scanner(System.in);
    
          System.out.print(">>> Richiesta (IMAGE/SOUND): ");
          String message =  userEntry.nextLine();
          while(!message.equals("IMAGE") && !message.equals("SOUND"))
          {
            System.out.println("\n>>> Riprovaci! <<<\n");
            System.out.print(">>> Richiesta (IMAGE/SOUND): ");
            message =  userEntry.nextLine();
          }
    
    // utilizza oggetto PrintWriter per mandare la richiesta al server
          outStream.println(message);
    
    // riceve il file
          getFile(inStream, message);
    
          link.close();
        }
        catch(IOException ioEx)
        {
          ioEx.printStackTrace();
        }
        catch(ClassNotFoundException cnfEx)
        {
          cnfEx.printStackTrace();
        }
      }
     
    
      private static void getFile(ObjectInputStream inStream, String fileType)
                throws IOException, ClassNotFoundException
      {
    // utilizza metodo readObject di ObjectInputStream per ricevere il file
    // dal server facendo un cast di tipo da Object a byte[]
        byte[] byteArray = (byte[])inStream.readObject();
    // crea oggetto FileOutputStream per ricevere dati
        FileOutputStream mediaStream;
    
    // riceve dati a seconda del tipo di file passando il nome del file
        if (fileType.equals("IMAGE"))
          mediaStream = new FileOutputStream("./DOWNLOAD/image.jpg");
        else
          mediaStream = new FileOutputStream("./DOWNLOAD/canzone.mp3");
    
    // utilizza metodo write di FileOutputStream per riempire il file
    // con array di byte
        mediaStream.write(byteArray);
      }
    }
    L'anno scorso funzionava alla perfezione, quest'anno il server mi da quest'errore (esempio SOUND)
    codice:
     
    Accepted connection : Socket[addr=/192.168.0.3,port=2360,localport=7778]
    java.io.FileNotFoundException: .\DATABASE\canzone.mp3 (Impossibile trovare il percorso specificato)
    	at java.io.FileInputStream.open(Native Method)
    	at java.io.FileInputStream.<init>(Unknown Source)
    	at java.io.FileInputStream.<init>(Unknown Source)
    	at MediaServer.sendFile(MediaServer.java:76)
    	at MediaServer.main(MediaServer.java:57)
    non riesco a capire il perchè, ho provato a cambiare i percorsi, a mettere "java.io.File.separator" sono disperato, aiutatemi !!!
    Grazie ;-)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Problema invio file

    Originariamente inviato da cavo89
    non riesco a capire il perchè, ho provato a cambiare i percorsi, a mettere "java.io.File.separator" sono disperato, aiutatemi !!!
    "./DATABASE/canzone.mp3" è corretto come specifica del file. Solo che è un path "relativo" ..... relativo alla directory corrente.

    Quale è la directory corrente? (io non lo posso sapere, ovviamente). Se quando lanci la applicazione server con la classe MediaServer la directory corrente è quella che contiene DATABASE e a sua volta canzone.mp3 ... allora OK.

    Altrimenti hai appena trovato l'errore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    14
    "./DATABASE/canzone.mp3" è corretto come specifica del file. Solo che è un path "relativo" ..... relativo alla directory corrente.

    Quale è la directory corrente? (io non lo posso sapere, ovviamente). Se quando lanci la applicazione server con la classe MediaServer la directory corrente è quella che contiene DATABASE e a sua volta canzone.mp3 ... allora OK.

    Altrimenti hai appena trovato l'errore.
    Il file MediaServer è contenuto in una cartella insieme alla cartella DATABASE, se è questo che intendi...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cavo89
    Il file MediaServer è contenuto in una cartella insieme alla cartella DATABASE, se è questo che intendi...
    Io parlavo della directory "corrente". Non è detto che la directory corrente sia quella dove fisicamente è presente MediaServer.class e DATABASE. Dipende da come/da dove lanci la applicazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2025 vBulletin Solutions, Inc. All rights reserved.