Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di bonobo
    Registrato dal
    Sep 2008
    Messaggi
    103

    [Java]Gestire inputstream

    ciao a tutti,
    sto facendo creando un proxy e mi sn incartato su una scemata a mio avviso..ma nn so propio come risolverla..

    dopo aver mandato la richiesta al server..la sua risposta la gestisco cosi...

    codice:
    InputStream is = s.getInputStream();
    OutputStream os = s.getOutputStream();
    os.write(request.getBytes());
    int r;
    while ((r = is.read(buffer)) >= 0)  
    {
         String rispserver +=new String(buffer, 0, r);
    }
    s.close();
    pero cosi converte la risposta del server in stringa,e poi io con getByte() la riconverto quando la mando al browser...
    finche le richieste sono tutte html/text tutto ok..funziona alla grande..
    ma con le immagini ad esempio ho grandi problemi..perche la conversione in striga e poi di nuovo byte modifica il formato..
    come faccio a far passare cio che mi manda il server..cosi com'è?
    senza conversioni??
    mi rendo conto che è una stupidata ma nn ci arrivo...

    grazie mille!

  2. #2
    Nel ciclo while non inserire la risposta in una stringa ma in un array di byte.

    Se ti dovesse in seguito servire la stringa puoi sempre usare il costruttore
    new String(byte[] data).

  3. #3
    Utente di HTML.it L'avatar di bonobo
    Registrato dal
    Sep 2008
    Messaggi
    103
    Originariamente inviato da peppem
    Nel ciclo while non inserire la risposta in una stringa ma in un array di byte.

    Se ti dovesse in seguito servire la stringa puoi sempre usare il costruttore
    new String(byte[] data).
    ok ci avevo pensato anch io..
    ma quanto sara lungo questo array?boh sto andando in super confusione per sta scemata...
    ufff...

    codice:
    while ((r = is.read(buffer)) >= 0)
        {
             byte[] risposta = buffer[???]; 
        }

  4. #4
    scrivi i byte all'interno di un ByteArrayOutputStream,
    quando termina il ciclo perchè is.read() restituisce -1
    allora potrai usare il metodo .toByteArray() proprio del ByteArrayOutputStream.


    n.b
    Non dimenticare di chiudere tutti gli stream che apri nella clausola finally del try catch

  5. #5
    Utente di HTML.it L'avatar di bonobo
    Registrato dal
    Sep 2008
    Messaggi
    103
    Originariamente inviato da peppem
    scrivi i byte all'interno di un ByteArrayOutputStream,
    quando termina il ciclo perchè is.read() restituisce -1
    allora potrai usare il metodo .toByteArray() proprio del ByteArrayOutputStream.


    n.b
    Non dimenticare di chiudere tutti gli stream che apri nella clausola finally del try catch
    ti dispiacerebbe farmi un esempio?

    scusami eh..

  6. #6
    Codice PHP:
    public class Main {

        public static 
    void main(String[] args
        {
            
            
    InputStream is null;
            
    HttpURLConnection con null;
            try
            {
                  
    //apertura connessione e stream
                
    URL url = new URL("http://www.google.com");
                
    con = (HttpURLConnectionurl.openConnection();
                
    is con.getInputStream();

                
    //stream su cui memorizzare i dati letti
                
    ByteArrayOutputStream bos = new ByteArrayOutputStream();

                
    //lettura dallo stream
                
    int r;
                while ((
    is.read()) != -1)
                {
                    
    bos.write(r);
                }

                
    //conversione in array di byte
                
    byte[] data bos.toByteArray();

                
    //conversione in stringa
                
    System.out.println(new String(data));
            } catch (
    IOException ex)
            {
                
    Logger.getLogger(Main.class.getName()).log(Level.SEVEREnullex);
            } 
            finally
            {
                try
                {
                    
    is.close();
                } catch (
    IOException ex)
                {
                    
    Logger.getLogger(Main.class.getName()).log(Level.SEVEREnullex);
                }
            
    con.disconnect();
            
            }
            
        }
        
       


  7. #7
    Utente di HTML.it L'avatar di bonobo
    Registrato dal
    Sep 2008
    Messaggi
    103
    grazie mille!
    mi ha illuminato...
    ed ho capito che è decisamente tutto molto piu semplice di quello che pensavo..

    io pratica il mio proxy passa totalmente la risposta che mi arriva dal server..
    cosi come arriva..
    quindi usando il mio metodo
    codice:
    while ((r = is.read(buffer)) !=-1)   {
          }
    dentro buffer che è un array di byte...
    codice:
    byte[] buffer = new byte[1024];
    ho gia tutto quello che mi serve...ovvero la risposta del server....o no?


    ora devo solo capire come mandare quel array sul os..
    os.write(?)...

    ed il gioco è fatto?sono sulla strada giusta?

    grazie mille per la disponibilità peppem

  8. #8
    Tutto quello che ti serve è dentro l'input stream.
    Esso viene però conservato prima in un ByteArrayOutputStream (utilizzato perchè non conosciamo la quantità di dati in input*)
    E poi viene convertito in un array di dati primitivi

    byte[] data.

    dentro data hai l'intera risposta che puoi girare su un'altro stream o stampare a video come fatto nell'esempio.

    (*) in realtà se prendi i dati attraverso http potresti leggere l'header content-lenght per estrarre il numero di byte da leggere e quindi preinizializzare il tuo array di byte

  9. #9
    Utente di HTML.it L'avatar di bonobo
    Registrato dal
    Sep 2008
    Messaggi
    103
    Originariamente inviato da peppem
    Tutto quello che ti serve è dentro l'input stream.
    Esso viene però conservato prima in un ByteArrayOutputStream (utilizzato perchè non conosciamo la quantità di dati in input*)
    E poi viene convertito in un array di dati primitivi

    byte[] data.

    dentro data hai l'intera risposta che puoi girare su un'altro stream o stampare a video come fatto nell'esempio.

    (*) in realtà se prendi i dati attraverso http potresti leggere l'header content-lenght per estrarre il numero di byte da leggere e quindi preinizializzare il tuo array di byte
    ok grazie mille peppem,domani provo ad usare httpurlconnection..
    al limite riscrivo qui...ihih...

    a presto

  10. #10
    Utente di HTML.it L'avatar di bonobo
    Registrato dal
    Sep 2008
    Messaggi
    103
    ciao a tutti,scusate l'insistenza ma nn riesco a capire se sono io che non ci arrivo..o boh!
    prima di provare httpurlconnction ho deciso di provare senza..e nn capisco perche nn funzioni!

    questoè il metodo start del mio thread e sarebbe il lato server del proxy che per adesso non deve fare nulla,dev essere un proxy fantasma,riceve la richesta dal browser e la passa alla classe Cproxy:
    codice:
    public void start(){
    try{
         byte[] buffer = new byte[2048];
         OutputStream os = s.getOutputStream(); 
                 InputStream is = s.getInputStream();
                 int r;
     				while ((r = is.read(buffer)) !=-1) {
     					String richiestaclient= new String(buffer, 0, r);
         				        StringTokenizer tok = new StringTokenizer(richiestaclient);  
       				        tok.nextToken("//"); 
        				        String host1= tok.nextToken(); 
    				        System.out.println("\nrichiesta del client:\n" + host1+"\n"); 
        				        System.out.print(richiestaclient); 
        				        CProxy prova= new CProxy(richiestaclient,host1);  
       				        prova.start(); 
         				        System.out.println("\nrisposta del server:\n" +prova.risposta()+"\n");
       				       os.write(prova.risposta());  
       					
    			} 	
    			     	   s.close(); 
      			}catch(Exception e){
                                System.err.println("Client error");
     			e.printStackTrace();
               }
     	}
    la classe Cproxy reinvia la richiesta del browser al server e poi passa la risposta al metodo start del thread che la reinvia al browser :


    codice:
    public void start(){
     			 	try {
     				Socket s = new Socket();
     				InetAddress add= InetAddress.getByName(indirizzo);
     				SocketAddress endpoint= new InetSocketAddress(add,80);
     				s.connect(endpoint);
     				InputStream is = s.getInputStream();
     				OutputStream os = s.getOutputStream();
     				os.write(request.getBytes());
     				int r;
     				while ((r = is.read(buffer)) != -1) { 						rispserver +=new String(buffer, 0, r);
     				appoggio=buffer;
     							
     				} 
    				s.close();
     				}catch (Exception e) {
     					e.printStackTrace();
     				}
     			}
    
     public byte[] risposta(){
     		 return appoggio;
    	}
    non vi ho copiato costruttori e dichiarazione variabili...
    sia buffer che appoggio sono di tipo byte[]!
    non capisco...nel primo pezzo di codice alla fine facendo prova.risposta() dovrei avere come ritorno una varaibile di tipo byte[] contentente la risposta del vero server da girare al browser!
    perche nn funziona??

    vi prometto che è l'ultima domanda,poi non rompo piu...

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.