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

    Programma Tansfer File via UDP (TFTP)

    Ciao a tutti. Sto cercando di sviluppare un programma che mi consenta il traferimento dati via UDP da un Client ad un Server. Mi spiego meglio. Il server deve mettersi in attesa per una richiesta di invio file.
    Il file verrà sempre salvato nella cartella predefinita. Il client che desidera inviare il file si collega con dei DatagramSocket al server ed effettua l'invio.
    Le due classi comunicano perfettamente e il client invia il file al server.
    Il problema è che il server non acquisisce il file e di conseguenza non lo crea e non lo salva nella cartella specifica. Eroriuscito a farlo creare ma a quel punto creava solo una copia del file senza nessun dato al suo interno.
    Come posso fare?
    Vi ringrazio in anticipo per l'aiuto e vi posto il codice delle due classi.
    Grazie mille

  2. #2
    codice:
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    
    
    
    public class TFTP_Server {
        
        DatagramSocket dataSocket;
        DatagramPacket dataPacket;
        
        private int porta;
        private String destinazione;
        
        /****   METODO PRINCIPALE  *****/
        public void connessioneRicezione() throws IOException {
            
            int read = 0;
            int tot = 0;
            String nome = null;
            long dimensione = 0;
            
             porta = 9876;
            destinazione = "C:\\prova\\";
            System.out.println("La cartella di destinazione è " +destinazione);
            //System.out.println(" ");
            // Creo la connessione 
            try {
                dataSocket = new DatagramSocket(porta);
                System.out.println("Server in attesa sulla porta: " +porta);
                
            } catch (IOException e) {
                e.printStackTrace();
            } 
            
            byte[] buf = new byte[1024];
            System.out.println("Attendo un Client ... ");
            dataPacket = new DatagramPacket(buf, buf.length);
            
                
            String name = acquisisci_nome(nome);
            System.out.println("Il nome del file é: " +name);
            File file = new File(destinazione+name);
            
            ricevi_File(file, name);
            
            
            
            
            
        } // FINE CONNESSIONE
        
        private void ricevi_File(File file, String name) throws IOException {
            
            String nome = name;
            int read = 0;
            int tot = 0;
            
            String percorso = file.getAbsolutePath();
            System.out.println("Destinazione : " +percorso);
            byte[] buf = new byte[1024];
            
            FileInputStream inputStream = new FileInputStream(file);
            FileOutputStream fos = new FileOutputStream(percorso);
            System.out.println("creato file in:" +percorso);
            try{
                while ((read = inputStream.read(buf)) != -1) {
                    dataSocket.receive(dataPacket);
                    tot += read;
                    fos.write(nome.getBytes());
                }  
            }catch (java.net.SocketException e)
            {
                    System.out.println("*** FILE RICEVUTO CON SUCCESSO ***");
                
            }
                
              
        }
        
        private String acquisisci_nome(String nome) throws IOException {
            String nome_file = null;
            
                dataSocket.receive(dataPacket);
                
                //Acquisisco le informazioni del client che si collega
                InetAddress address = dataPacket.getAddress();           
                String client = address.getHostName();          
                int port = dataPacket.getPort();
                
                nome_file = (new String(dataPacket.getData()).trim());       
                return nome_file;
        }
    
        
        public static void main(String[] args) throws IOException
            {
                TFTP_Server tftpServer = new TFTP_Server();
                tftpServer.connessioneRicezione();
            }
    
        
        
        
            
            
       
        
    }

  3. #3
    codice:
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import javax.swing.JFileChooser;
    
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
        
    /**
     *
     * @author ste
     */
    public class TFTP_Client {
        
        DatagramSocket dataSocket;
        DatagramPacket dataPacket;
        
        String nome;
        long dimensione;
        private InetAddress indirizzoServer;
        private int porta;
        
        public void Start() throws IOException {
                
                porta = 9876;
                indirizzoServer = InetAddress.getByName("127.0.0.1");  
            
                JFileChooser fileChooser = new JFileChooser();
                int n = fileChooser.showOpenDialog(null);
                File file = fileChooser.getSelectedFile(); 
                String path_file = file.getAbsolutePath();
                nome = file.getName();
                dimensione = file.length();
           
                //System.out.println("Il nome del fileselezionato è: " +nome);
                System.out.println("La sua dimensione :  " +dimensione+ " byte");
                System.out.println("Percorso: " +path_file);
                
                invia_Nome(nome);
                invia_File(file, nome );
        }
        
        private void invia_File(File file, String nome) throws IOException {
            System.out.println("*** Inizio invio file");
        
            try {
                dataSocket = new DatagramSocket();
                byte[] buf = new byte[1024];
                int read,tot=0;
                FileInputStream inputStream = new FileInputStream(file);
                dataPacket = new DatagramPacket (buf, buf.length, indirizzoServer, porta);
                
                // INVIO I PACCHETTI 
                while ((read = inputStream.read(buf)) != -1 ){
                    tot += read;
                    System.out.println("  - "+tot+ " byte");
                    dataSocket.send(dataPacket);
                }
                System.out.println("*** FILE INVIATO CON SUCCESSO ***");    
            } catch (FileNotFoundException e) {
                e.printStackTrace();    
            }
            
        }   // FINE INVIA_FILE   
    
        private void invia_Nome(String nome) throws IOException {
            
            dataSocket = new DatagramSocket();
            String nome_file = nome;
            System.out.println("Il nome del file è: " +nome_file);
            byte [] name = {0};
            name  = nome_file.getBytes();
            dataPacket = new DatagramPacket (name, name.length, indirizzoServer, porta);
            dataPacket.setData(name);
            dataPacket.setLength(name.length);
            
            // INVIO DEL PACCEHTTO SUL SOCKET
            dataSocket.send(dataPacket);
        }// FINE INVIA NOME
        
       
        
        
    
        public static void main(String[] args) throws IOException
            {
                TFTP_Client tftpClient = new TFTP_Client();
                tftpClient.Start();
            }
    
        
    
        
    
        
    }

  4. #4
    Nessuno può aiutarmi ????? =(

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    anche il log di una tua esecuzione (con eventuali errori) potrebbe essere utile (giusto per iniziare ad avere una idea di quale possa essere il problema)
    il fatto che dove hai delle eccezioni non fai vedere cosa siano non è bene.
    Poi quando scrivi i file, dopo aver ricevuto i dati è bene fare un flush dello stream, oltre alla chiusura del file stesso quando hai finito.
    prova a controllare se finalizzi o meno il file e poi vediamo
    RTFM Read That F*** Manual!!!

  6. #6
    Si hai ragione.
    Allora, intanto ho levato il while(true) per il ciclo infinito in modo di riuscire a fare le prove
    su una singola ricezione.
    Il programma non da errori e mi crea il file solo che il suo contenuto è vuoto (o kb)
    mi sa che non sto gestendo bene i fileInputStream e FileOutputStream.
    Devo essere sincere in quella parte sono andato un po a naso e mi sa che è li che non riesce
    a ricevere i dati del file.

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Nel ciclo del server (dove ricevi i dati da scrivere nel file):


    codice:
    while ((read = inputStream.read(buf)) != -1) {
       dataSocket.receive(dataPacket);
       tot += read;
       fos.write(nome.getBytes());
    }

    La parte che ho sottolineato: continui a scrivere dentro al file i byte (codificati col charset di default) della stringa contenente il nome del file... e già questo non ha alcun senso... devi scrivere nel file il pacchetto di dati che hai ricevuto... non il nome del file.


    Poi, da nessuna parte effettui un flush() dei dati (consigliabile, perchè nessuno ti garantisce che la quantità di dati ricevuta sia sufficiente a riempire l'eventuale buffer, né qualcuno ti garantisce che i dati siano effettivamente scritti nel file dal sistema sottostante), e nemmeno la chiusura del FileOutputStream, cosa necessaria: quando si ha finito di usare un file, lo si deve sempre chiudere.


    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

  8. #8
    Allora, prima di tutto grazie per le dritte Lele =)
    Ho modificato il codice nel seguente modo.

    codice:
     while ((read = inputStream.read(buf)) != -1) {
                    dataSocket.receive(dataPacket);
                    tot += read;
                    fos.write(dataPacket.getData());
                    fos.flush();
                }  
                fos.close();
    Adesso mi da l'errore che il file non esiste però (Nel FileInputStream)


    Exception in thread "main" java.io.FileNotFoundException: C:\prova\prova.txt (Impossibile trovare il file specificato)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.jav a:146)
    at TFTP_Server.ricevi_File(TFTP_Server.java:71)
    at TFTP_Server.connessioneRicezione(TFTP_Server.java: 57)
    at TFTP_Server.main(TFTP_Server.java:108)

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Non ci avevo fatto caso... ma il server non deve leggere da un File, ma dalla DatagramSocket. Quindi non può usare FileInputStream (né ha alcun senso usarlo).

    I dati non li ricevi da un FileInputStream (il client sì, perchè ha a disposizione il file originario), ma dalla DatagramSocket, che è l'unico punto di "contatto" tra il client ed il server.


    Sul client:
    Leggi dal FileInputStream e scrivi sulla DatagramSocket

    Sul server:
    Leggi dalla DatagramSocket e scrivi sul FileOutputStream.


    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
    Scusa ma allora come faccio a fare il ciclo while fino alla dimensione del file????
    Devo cavarlo? Ma dopo in quel caso come faccio a ricevere tutti i pacchetti?
    Scusa per la mia ignoranza ma con le datagramsocket è la prima volta che ci sbatto la testa.
    Perchè con le Socket normali facevo un ObjectInputStream

    codice:
    oos = new ObjectOutputStream(socket.getOutputStream());
    e poi facevo il ciclo While su questo:

    codice:
    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
               while ((read = ois.read(buf)) != -1) {
                    tot += read;
                    System.out.println("  - "+tot+ " byte");
                    // scrivo il pacchetto su disco
                    fos.write(buf, 0, read);
                }

    Il problema è che le datagrmaSocket non hanno il GetInputStream =(
    Ultima modifica di sanchez88; 09-07-2014 a 14:37

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.