Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    68

    Problema con HTTP header

    Salve a tutti,
    ho creato in pratica un programma che permette di controllare le connessioni degli utenti attraverso l'IP, è un semplice tramite. Client -> Mio programma -> Server. In pratica quando il client che sarebbe il browser invia gli header al server, il server li intrerpreta correttamente ma quando il mio programma li rinvia al browser Mozilla Firefox (Su ie funziona anche se le immagini si vedono maluccio) restiuisce tutto testualmente :
    codice:
    HTTP/1.1 200 OK
    Date: Wed, 29 Jul 2009 12:20:30 GMT
    Server: Apache/2.2.11 (Win32) PHP/5.2.8
    Content-Length: 1437
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: text/html;charset=UTF-8
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
    <html>
     <head>
      <title>Index of /</title>
     </head>
     <body>
    <h1>Index of /</h1>
    <table><tr><th>[img]/icons/blank.gif[/img]</th><th>Name</th><th>Last modified</th><th>Size</th><th>Description</th></tr><tr><th colspan="5"><hr></th></tr>
    <tr><td valign="top">[img]/icons/folder.gif[/img]</td><td>AntiDos/               </td><td align="right">28-Jul-2009 18:50  </td><td align="right">  - </td></tr>
    <tr><td valign="top">[img]/icons/folder.gif[/img]</td><td>articoli/              </td><td align="right">06-Jul-2009 14:42  </td><td align="right">  - </td></tr>
    <tr><td valign="top">[img]/icons/folder.gif[/img]</td><td>img/                   </td><td align="right">17-Jul-2009 15:56  </td><td align="right">  - </td></tr>
    <tr><td valign="top">[img]/icons/folder.gif[/img]</td><td>never/                 </td><td align="right">17-Jul-2009 15:57  </td><td align="right">  - </td></tr>
    <tr><td valign="top">[img]/icons/folder.gif[/img]</td><td>zerosaved/             </td><td align="right">25-Jul-2009 12:23  </td><td align="right">  - </td></tr>
    <tr><th colspan="5"><hr></th></tr>
    </table>
    </body></html>
    E il codice che rinvia tutto è un semplice thread:
    codice:
    public class Ricevi implements Runnable{
    
    private Socket ServerR;
    private Socket client;
    private int number;
    
    public Ricevi(Socket client_r, Socket server_r, int numero){
    
    client = client_r;
    
    ServerR = server_r;
    
    number = numero;
    
    }
    
    public void run(){
    
    try{
    
    BufferedReader iStreamR = new BufferedReader(new InputStreamReader(ServerR.getInputStream()));
    
    while(true){
    
    		   
    		    String lineR = iStreamR.readLine();
    			
             	
    			if(lineR == null){
    			
    
    			client.close();
    			ServerR.close();
    			
    	
    			break;
    			
    			}else{
    			
    			
    				oStream[number].println(lineR);
    			
    			
    			}
    			
    
    		
    		           }
    		 
    
    
        }catch(Exception error){
    
    System.out.println("$ - Errore nel sotto Thread, Questo errore può essere causato dall'utente che si è disconnesso\n Errore: "+error.getMessage());
    try{
    
    client.close();
    ServerR.close();
    
    }catch(Exception errore){
    
    System.out.println(" $ - Impossibile chiudere connessione? Probabilmente la connessione è già stat chiusa\n"+errore.getMessage());
    
    }
    
    
     }
    
    }//Funzione
    
    }
    Questo codice funziona con server che non sono Web Server sulla 80. Vi prego aiutatemi datemi qualche consiglio non so cosa fare..

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    68
    vi prego aiutatemi è per un compito... sono disposto a offrire soldi per la soluzione

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    68
    è difficile persino per voi deduco... xD

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da ExSoax
    Vi prego aiutatemi datemi qualche consiglio non so cosa fare..
    è difficile persino per voi deduco... xD
    La questione è che innanzitutto bisognerebbe chiarire cosa vuoi fare .... un "proxy"??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    68
    No, l'ho scritto è un intermezzo che permette di controllare le connessioni di utenti al tuo server

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    68
    comunque per ricevere dal client non trovo problemi solo quando rinvio al browser

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da ExSoax
    No, l'ho scritto è un intermezzo che permette di controllare le connessioni di utenti al tuo server
    Ah ok, quindi una cosa molto più specifica. Ovvero l'utente che usa il browser "sa" (gli sarà stato detto, no?) che deve mettere l'indirizzo(/porta) del "tuo" server in Java, che farà poi la connessione verso il "vero" server.
    Se non devi interpretare le richieste a livello HTTP, non devi estrarre informazioni dagli header o dal "body" di request/response .... insomma, se il tuo server Java non deve usare nulla a livello HTTP, non devi necessariamente leggere "a righe".
    Tutto ciò che ricevi devi passarlo pari pari, pedestremente byte per byte al server e viceversa.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    68
    Quindi utilizzo un OutputStream e poi uso la funzione Write per restituire ogni byte?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    68
    ho modificato il codice in questo modo ma non viene modificato nulla.
    codice:
    try{
    
    InputStream iStreamR = ServerR.getInputStream(); 
    OutputStream out = client.getOutputStream();
    while(true){
    
    		   
    		    int lineR = iStreamR.read();
             	
    			if(lineR < 0){
    			
    			ServerR.close();
    			client.close();
    			
    			break;
    			
    			}else{
    			
    			out.write(lineR);
    			
    			}
    			
    			
    
    		
    		           }
    		 
    
    
        }catch(Exception error){
    
    System.out.println("$ - Errore nel sotto Thread, Questo errore può essere causato dall'utente che si è disconnesso\n Errore: "+error.getMessage());
    try{
    
    client.close();
    ServerR.close();
    
    }catch(Exception errore){
    
    System.out.println(" $ - Impossibile chiudere connessione? Probabilmente la connessione è già stat chiusa\n"+errore.getMessage());
    
    }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da ExSoax
    Quindi utilizzo un OutputStream e poi uso la funzione Write per restituire ogni byte?
    Ripeto la cosa e aggiungo una serie di questioni (che poi dovrai valutare tu).

    Se non devi trattare nulla a livello di HTTP (non devi ispezionare/modificare nulla di header/body) si potrebbe tranquillamente far "passare" pedestremente i byte dal client al server e viceversa usando dei OutputStream/InputStream. Il fatto di lavorare a livello più basso del HTTP però pone delle questioni:

    a) Il client probabilmente non vuoi che "sappia" che si collega poi alla fin fine con il server ma solo che deve collegarsi con il tuo software Java che fa da tramite. Va tutto bene ... ma se il server in una pagina fornisce un link assoluto al sito oppure genera una response di "redirect" (che ha un URL assoluto), sei panato. Il client poi va a collegarsi direttamente con il server e bypassa il tuo software Java.

    b) Lavorando a livello di byte "crudi", per ogni connessione (Socket) devi gestire i due flussi di comunicazione con 2 thread separati. Un thread gestisce client->tuaApp->server e l'altro il contrario ovvero server->tuaApp->client. Il motivo è che lavorando a basso livello tu non "sai" quando uno dei due fa una "domanda" e quando invece legge e si aspetta una "risposta". E se si usa, come è tipico, HTTP 1.1 con il "keep-alive", uno stesso socket può essere riutilizzato per più request/response.

    Se queste questioni ti creano problemi, allora dovresti trattare i dati a livello di HTTP ma devi fare una gestione più appropriata. Nel senso che gli header li devi trattare "a righe" di caratteri ma il body lo devi trattare come stream "crudo" di byte. E questo in sostanza significa che non puoi usare ad esempio un BufferedReader perché "bufferizza" troppo. Dovresti usare solo stream di byte e andare tu a cercare, byte dopo byte, i fine riga per determinare le linee e devi determinare tu quando finiscono gli header e passare poi ad una lettura "cruda" di byte.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java 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 © 2024 vBulletin Solutions, Inc. All rights reserved.