Autore Topic: outputstream bloccato in una connesione ftp Upload  (Letto 664 volte)

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
outputstream bloccato in una connesione ftp Upload
« il: 12 Aprile 2012, 11:07:32 CEST »
0
Salve a tutti, sto realizzando un programmino che mi carica un file su un server ed io monitoro il traffico dei dati che l'app e il server si scambiano. L'Upload lo genero tramite la funzione write(buffer) di un outputstream da un file in momoria a una connessione ftp(che si è verificata).
Questa funzione si trova dentro un timer che viene ripetuto ogni 10millisecondi, il problema che per adesso capita solo con un device fisico(ne ho provati diversi) e poi con tutti gli emulatori che la funzione write si blocca e il programma va a farsi benedire.
Vorrei capire cosa può essere la causa del blocco del write, il file che vado a caricare è presente in memoria lo genero io prima di partire con la connessione e il relativo upload.
Grazie dell'aiuto:)

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #1 il: 12 Aprile 2012, 11:59:42 CEST »
0
ho risolto da solo e non capisco bene neanche come ho fatto.
Comunque mi sono messo a pensare e visto che il write si blocca quando non riesce a scrivere o non riesce a finire di scrivere l'unico motivo per cui non riusciva era che c'erano problemi lato connessione server(visto che il file da caricare è perfetto).
Quindi ho aggiunto semplicemente una richiesta al server tramite la funzione "isConnected();" ogni tot millisecondi che interrogando il server e me lo tiene sveglio(credo). sta di fatto che funziona.
Se pensate che ci sia dell'altro o riuscite a immaginare il perché non funzionava e adesso si mi farebbe piacere sentire le vostre ipotesi(lascio la discussione aperta)

Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #2 il: 12 Aprile 2012, 22:46:29 CEST »
0
Ciao mambu,
hai utilizzato qualche libreria esterna per utilizzare un client FTP?
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #3 il: 12 Aprile 2012, 22:48:56 CEST »
0
Si, ho usato le librerie di apache

Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #4 il: 12 Aprile 2012, 23:07:56 CEST »
0
Allora se ti può interessare, l'upload di un file presente già sul terminale io l'ho implementata così:
Codice (Java): [Seleziona]
/** Metodo per caricare un file sul Server FTP FUNZIONANTE
      * ftpClient: FTP client connection object (see FTP connection example)
      * @param srcFilePath Percorso del file sulla SD card
      * @param desFileName nome del file da memorizzare nel Server FTP
      * @param desDirectory percorso della cartella dove il file verrà  caricato
      * @return True se il file viene caricato correttamente. False altrimenti
      */

     public boolean ftpUpload(File srcFilePath, String desFileName, String desDirectory) {
         boolean status = false;
         try {
                //prendo il riferimento al file salvato sulla sd
                 File file = new File(srcFilePath, desFileName);
                //creo uno stream in input a partire dal mio file
             FileInputStream srcFileStream = new FileInputStream(file);
                // Cambio cartella di lavoro con la cartella di destinazione
             if (ftpChangeDirectory(desDirectory) == true) {
                 status = ftpClient.storeFile(desFileName, srcFileStream);
                 if (status == true)
                         Log.i(APPNAME, "File caricato correttamente");
                 else Log.i(APPNAME, "UPLOAD File NON CARICATO");
             }
             srcFileStream.close();
             return status;
         } catch(FileNotFoundException e1) {
                 Log.d(APPNAME, "FileNotFoundException: Upload fallito");
                 e1.printStackTrace();
         }
         catch (IOException e2) {
             Log.d(APPNAME, "IOException: Upload fallito");
             e2.printStackTrace();
           }
         return status;
     }
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #5 il: 13 Aprile 2012, 09:54:56 CEST »
0
pur troppo mi server "osservare" il traffico quindi non posso usare una funzione diretta come lo storefile, ma grazie comunque:)

Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #6 il: 17 Aprile 2012, 21:43:56 CEST »
0
Hai risolto mambu?
Scusa il ritardo, se ti serve ti posto un'alternativa al metodo che ho implementato dove non uso la funzione diretta.
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #7 il: 17 Aprile 2012, 21:49:04 CEST »
0
Hai risolto mambu?
Scusa il ritardo, se ti serve ti posto un'alternativa al metodo che ho implementato dove non uso la funzione diretta.
Ho provato alcune alternative solo che non funziona bene..se me lo mandi sarebbe il topo

Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #8 il: 17 Aprile 2012, 22:25:24 CEST »
0
Codice (Java): [Seleziona]
public int UploadTaskAsync(Parametri... params) {
            int count;
            String srcFilePath = rootDestinationFolder+"/"+params[0].getFtpFilenameUpload() ;  //path del file su sd card
                File testFile = new File(srcFilePath);
                        lengthOfFile = testFile.length();
               
                // Creo l'inputStream dal file presente sul terminale Android
            InputStream inputStream = null;
            OutputStream outputStream = null;
                        try {
                                inputStream = new FileInputStream(srcFilePath);
                       
                                // Ottengo l'outputStream da riempire dal server FTP
                                outputStream = clientFTP.storeFileStream(params[0].getFtpFilenameUpload());
                                if (outputStream == null) { // Se l'outputStream è vuoto allora ritorna null
                                        Log.i(APPNAME, "Non è possibile recuperare il file outputstream = null" );
                            return null;
                        }
                                        // Scrittura sull'outputStream
                                        byte data[] = new byte[1024];
                                        total_bytes_uploaded = 0;
                                        while ((count = inputStream.read(data)) != -1) {
                                                total_bytes_uploaded += count; //total è¨ il numero dei byte inviati
                                                outputStream.write(data, 0, count);
                                                outputStream.flush();
                                        }
                                       
                        } catch(Exception e1) {
                                e1.printStackTrace();
                                return null;
                        }
                    finally {
                        // Il finally che viene sempre eseguito (anche se ci sono dei return nel codice)
                        // si occupa della chiusura degli stream.
                        try {
                                outputStream.close();
                                inputStream.close();
                                if (clientFTP != null && clientFTP.isConnected() == true && clientFTP.completePendingCommand() == true)
                                        Log.i(APPNAME, "UploadAsyncTask Completato con successo: "+srcFilePath);
                        } catch (Exception e2) {
                                e2.printStackTrace();
                                        }
                       
                     }
                       
                     return 1;
        }

Dovrebbe Andare bene ;)
« Ultima modifica: 17 Aprile 2012, 22:28:05 CEST da alexAndroid »
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #9 il: 18 Aprile 2012, 09:22:04 CEST »
0
               // Scrittura sull'outputStream
               byte data[] = new byte[1024];
               total_bytes_uploaded = 0;
               while ((count = inputStream.read(data)) != -1) {
                  total_bytes_uploaded += count; //total è¨ il numero dei byte inviati
                  outputStream.write(data, 0, count);
                  outputStream.flush();
                }

assomiglia molto al mio primo script, ti volevo chiedere una cosa: nel pezzetto che ti ho quotato, count non è sempre uguale a 1024?
Visto che tu leggi un file in memoria penso che il telefono non abbia problemi a riempire il tuo bufferino, mentre secondo me il while potrebbe risultare rallentato dal write che invece dipende dall'andamento della rete


Offline alexAndroid

  • Utente normale
  • ***
  • Post: 185
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Giò
  • Sistema operativo:
    Ubuntu 11.10; Windows XP
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #10 il: 18 Aprile 2012, 09:26:05 CEST »
0
Dunque dove sta il problema?
Non ti serviva monitorare l'andamento del file caricato sul Server?
Sei stato aiutato oppure il tuo problema è stato risolto? Allora premi il tasto THANKS E' un modo utile e carino per ringraziare chi ti è stato di aiuto.

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:outputstream bloccato in una connesione ftp Upload
« Risposta #11 il: 18 Aprile 2012, 09:34:40 CEST »
0
aah ok tu usi count solo per verificare la fine del file(scusa che scemo :-[ ), ok adesso ha più senso, non capivo perché ne tenevi traccia visto che era sempre uguale..
lo provo, grazie della mano.
posso chiudere il topic mi sembrano che ci siano abbastanza risposte esaustive;)