[RISOLTO]http response server java

di il
7 risposte

[RISOLTO]http response server java

Ho creato un server http in java però appena richiedo col browser la pagina di prova firefox mi stampa nella pagina l'header della risposta + il codice html come se fosse del semplice testo. Ho provato di tutto, sia dallo stringere all'osso gli attributi dell'header sia che mettendo tutti glli attributi.
Grazie a tutti per l'attenzione!

7 Risposte

  • Re: [RISOLTO]http response server java

    Beh, se non mostri il codice, che si può dire?
  • Re: [RISOLTO]http response server java

    Si, giusto. Avevo creato il post col cellulare e non avevo il codice.
    
    				server = new ServerSocket(port);
    				System.out.println("Server in attesa di client...");
    				System.out.println("# richieste: " + numeroRichieste);
    				System.out.println("# risposte : " + numeroRisposte);
    				System.out.println("------------------------------------");
    				client = server.accept();
    				input = new DataInputStream(client.getInputStream());
    				output = new DataOutputStream(client.getOutputStream());
    				
    				while(input.available() > 0)
    					System.out.println(input.readLine());
    				numeroRichieste++;
    				
    				// -----
    				String s = "<html><body>ciao</body></html>";
    				
    				output.writeChars("HTTP/1.1 200 OK\r\n");
    				output.writeChars("Date: " + new Date().toString() + "\r\n");
    				output.writeChars("Server: me\r\n");
    				output.writeChars("Content-Type: text/html; charset=utf-8\r\n");
    				output.writeChars("Content-Encoding: gzip\r\n");
    				output.writeChars("Content-Length: " + s.length() + "\r\n");
    				output.writeChars("Connection: keep-alive\r\n");
    				output.writeChars(" \r\n");
    				output.writeChars(s);
    				output.flush();
    				// -----
    				
    				numeroRisposte++;
    				
    				input.close();
    				output.close();
    				client.close();
    				server.close();
    
  • Re: [RISOLTO]http response server java

    PiraLezz ha scritto:


    				String s = "<html><body>ciao</body></html>";
    				
    				output.writeChars("HTTP/1.1 200 OK\r\n");
    				output.writeChars("Date: " + new Date().toString() + "\r\n");
    				output.writeChars("Server: me\r\n");
    				output.writeChars("Content-Type: text/html; charset=utf-8\r\n");
    				output.writeChars("Content-Encoding: gzip\r\n");
    				output.writeChars("Content-Length: " + s.length() + "\r\n");
    				output.writeChars("Connection: keep-alive\r\n");
    				output.writeChars(" \r\n");
    				output.writeChars(s);
    				output.flush();
    Qui ci sono purtroppo troppe cose che non vanno.

    1) Il date va inviato in un formato ben preciso (vedi specifiche HTTP), del tipo:
    Date: Tue, 15 Nov 1994 08:12:31 GMT

    Il toString() di Date fornisce la data in un formato fisso che non è assolutamente quello richiesto da HTTP.

    2) Perché invii Content-Encoding: gzip mentre lo stream fisico NON è di certo gzipped?

    3) Se indichi charset=utf-8, lo stream fisico dei byte deve essere l'encoding utf-8 dei caratteri. Nel tuo caso NON è così. writeChars di DataOutputStream scrive i caratteri come è indicato dal writeChar, ovvero da documentazione:

    Writes a char to the underlying output stream as a 2-byte value, high byte first.

    Quindi per ciascun carattere Unicode vengono inviati 16 bit, byte alto prima, poi byte basso dopo. E questo NON è UTF-8.

    4) Connection: keep-alive in realtà non lo è visto che chiudi tutto.

    5) Content-Length deve essere la lunghezza in byte del body ("octect", come è solito dire in ambito networking, che poi vuol dire appunto unità di 8 bit). Non è la lunghezza della stringa! Se la codifica in uscita fosse UTF-16 e la stringa ha 10 caratteri, il Content-Length dovrebbe essere 20. Quindi c'entra anche la codifica!


    Insomma, ci sono troppe cose inappropriate/errate. La mia impressione è che hai scopiazzato del codice di qua e di là senza comprendere bene cosa sono quegli header e come gestirli. Ti serve leggere una guida su HTTP.
  • Re: [RISOLTO]http response server java

    Salve! Si in effetti non sono un esperto di header http e ho dovuto scoppiazzare un po di header di prova, tuttavia anche con i consigli che mi hai dato il risultato continua ad essere sempre lo stesso :
    
    HTTP/1.1 200 OK
    Date: Mon, 15 Nov 2015 08:12:31 GMT
    Content-Type: text/html
    Content-Length: 30
    Connection: closed-alive
     
    <html><body>ciao</body></html>
    
  • Re: [RISOLTO]http response server java

    PiraLezz ha scritto:


    
    HTTP/1.1 200 OK
    Date: Mon, 15 Nov 2015 08:12:31 GMT
    Content-Type: text/html
    Content-Length: 30
    Connection: closed-alive
     
    <html><body>ciao</body></html>
    
    Scusa se te lo dico ma non puoi continuare a fare prove così "a caso". Innanzitutto "closed-alive" semplicemente non esiste, non ha senso.

    Poi comunque c'è una cosa che credo non sai: gli header HTTP vanno codificati esclusivamente in puro ASCII. Poi se il body contiene testo, allora i caratteri vanno codificati in sequenze di byte secondo un charset che deve essere coerente con quanto indica il Content-Type.
    Se il Content-Type non indica esplicitamente un charset, le specifiche HTTP dicono che il charset predefinito è ISO-8859-1.

    Non ho purtroppo tempo ora di mostrare un qualche esempio utile di codice.
  • Re: [RISOLTO]http response server java

    Ora che mi ci fai pensare ero convinto di aver scritto "closed" e invece mi sa che mi è partito anche un "-alive". Grazie dell'aiuto comunque! Ora cercherò di studiarmi questo protocollo HTTP più a fondo. Perdona la mia ignoranza in materia :c sono al secondo anno di specializzazione e mi è venuto in mente questo progettino.
  • Re: [RISOLTO]http response server java

    Ok, problema risolto!!
    Scrivo la soluzione per chi magari avrà un problema nel futuro simile.
    In pratica come detto da andbin gli header andavano codificati in puro ASCII, io utilizzando gli stream DataInputStream e DataOutputStream scrivevo con UTF-8 2byte per carattere. Me ne sono accorto vedendo con gli strumenti da sviluppatore di firefox la risposta che il mio server gli inviava, e segnava così:
    •H•T•T•P .... e via dicendo.
    Quindi sono passato agli stream BufferedReader e BufferedWriter, con questi non c'è nessun problema.
    Ringrazio andbin per la sua saggezza e la sua pazienza per me .
    Buon programmi a tutti!!
Devi accedere o registrarti per scrivere nel forum
7 risposte