Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    [Java] URLConnection: comportamento diverso tra interfaccia grafica e non

    Buongiorno a tutti.

    Qualcuno di voi ha mai riscontrato questo problema o ha idea del perchè sussista?

    Il problema: la parte di codice sottostante funziona in modo diverso a seconda che venga eseguita all'interno del main di un programma a linea di comando o invocata dalla pressione di un tasto da un programma con interfaccia grafica.

    Il codice:
    codice:
    String urlOrdRsp = ...;
    String authCode = ...;
    String linea = "";
    String nomeFile = "pippo.txt";
    
    try {
       PrintStream ps = new PrintStream( new FileOutputStream(nomeFile) );
    
       URL url = new URL(urlOrdRsp + authCode);
       URLConnection con = url.openConnection();
    
       BufferedReader br = new BufferedReader( new InputStreamReader(con.getInputStream()) );
       while((linea = br.readLine()) != null) ps.println( linea );
       br.close();
       ps.close();
    } catch (Exception e) {
       e.printStackTrace();
    }
    Se viene copiato e incollato all'interno del main di un programma ed eseguendolo da linea di comando (sostituendo, ovviamente, urlOrdRsp e authCode con argv[0] e argv[1]) questo codice funziona alla perfezione: si connette all'URL passato come primo parametro (+ il secondo, che è il codice di autenticazione) e viene generato il file di risposta (dall'altra parte c'è un sistema SAP di terze parti che risponde sempre con del testo).

    Se viene eseguito come chiamata di un metodo dopo la pressione di un pulsante, il codice termina immediatamente, senza generare alcuna eccezione e senza nemmeno generare il file (deduco, quindi, che non venga eseguita alcuna scrittura nel file poichè la prima lettura restituisce null, cosa impossibile visto che il SAP dall'altra parte risponde sempre con del testo).

    Sembra quasi che la lettura non aspetti l'effettiva ricezione dei dati, cosa che avviene all'interno del main... :master:

    Qualche idea?

    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

  2. #2
    ciao,
    Usare un HttpURLconnection? non va bene?

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    In realtà, ciò che viene restituito dalla getConnection() è esattamente una HttpURLConnection.


    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

  4. #4
    ma non torna un URLconnection?
    comunque...
    quando io ho fatto una cosa simile prima di fare conc.getInputStrea();

    ho fatto un:

    con.connect();

    e alla fine di tutto:

    con.disconnect();

    non so se ti possa aiutare, spero di si...

    CIAO

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da piunreks
    ma non torna un URLconnection?
    comunque...
    quando io ho fatto una cosa simile prima di fare conc.getInputStrea();

    ho fatto un:

    con.connect();

    e alla fine di tutto:

    con.disconnect();

    non so se ti possa aiutare, spero di si...

    CIAO
    URLConnection è una superclasse di HttpURLConnection. Il metodo getConnection() non può sapere a priori che tipo di connessione restituirà, quindi è firmato URLConnection.

    Ho già effettuato anch'io un tentativo utilizzando con.connect(), ma non è cambiato nulla.

    Sono 3 ore che ci sto sbattendo la testa...


    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

  6. #6
    Senti io non sono un grande esperto quindi ti posto il codice che ho usato io cosi vedi se ti viene qualche idea....
    Tieni presente che da quanto ho capito il tuo obiettivo è diverso dal mio, io dovevo prendere un file di testo in remoto e copiarmelo in locale...

    Spero ti sia utilie... CIAO

    P.S. la riga con i punti di domanda nel commento non so a cosa serva e non ricordo perchè c'è.... forse l'ho trovato su internet non so....

    codice:
                URL var=null;
                FileReader fr = null;
                PrintWriter out=null;
                HttpURLConnection connection=null;
                InputStream in=null;
                try {
                    var = new URL(myURL + nomeFile);
                } catch (MalformedURLException ex) {
                    ex.printStackTrace();
                }
                try {
                    connection = (HttpURLConnection) var.openConnection();    
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                connection.setRequestProperty("Range", "bytes=0-");  // ??
                try {
        
                    // mi connetto al server
                    connection.connect();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
    
                try {
                    in = connection.getInputStream();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                
                //Creo la cartella conf che deve contenere i file.
                
                dir = cm.internalCodebase + "/conf";
    
                //Creo la cartella conf che deve contenere i file.
                new File(dir).mkdirs();
                
                
                File fOut = new File(cm.internalCodebase+"/conf/"+fileDiConfig[i]);
                RandomAccessFile file = null;
                try {
                    file = new RandomAccessFile(fOut, "rw");
                } catch (FileNotFoundException ex) {
                    ex.printStackTrace();
                }
                try {
                    file.seek(0);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                byte[] buffer = new byte[1024];
    
                while (true) {
                    int read=0;
                    try {
                        read = in.read(buffer);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
    
                    // "read" contiene il numero di byte letti di volta in volta: quando    
                    // vale -1 non ho piu' nulla da scaricare: ho finito il download
                    if (read == -1) {
                        break;
                    }
                    try {
    
                        // scrivo il buffer nel file
                        file.write(buffer, 0, read);
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
                connection.disconnect();

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Niente da fare...
    Ho modificato il codice di lettura, passando ad una lettura byte per byte per vedere se cambiava qualcosa.
    Ho forzato il cast a HttpURLConnection per verificare se cambiava qualcosa.

    Nulla.

    Questo è il codice rimescolato:
    codice:
          HttpURLConnection con = (HttpURLConnection) url.openConnection();
          con.connect();
          InputStream is = con.getInputStream();
          byte[] buffer = new byte[4096];   // Leggo a blocchi di 4 KB
          int byteReaded = 0;
          while(byteReaded >= 0) {
             byteReaded = is.read( buffer );
             if (byteReaded >= 0) {
                byte[] bufToWrite = new byte[byteReaded];
                for(int k=0; k<bufToWrite.length; k++) bufToWrite[k] = buffer[k];
                ps.print( new String(bufToWrite) );
             }
          }
    Il codice è volutamente ridondante, ma nessuna scrittura viene eseguita, quindi nessun file viene creato.
    L'esecuzione termina subito, senza eccezioni.


    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
    e provare a scrivere in un RandomAccesFile come nel mio esempio col metodo .write()??

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Come non detto: lavorare troppo fa male, ma anche le assenze per malattia.
    Tutto funziona perfettamente: il file viene generato ed il componente successivo che viene richiamato si occupa di fare pulizia del file... è una parte che avevo attivato la scorsa settimana prima di andarmene in malattia e me n'ero dimenticato (anche lavorare con 39 di febbre non fa affatto bene )...


    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
    ah ah ok bene cosi dai....

    ciao

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.