Server HTTP non funziona

di il
10 risposte

Server HTTP non funziona

Salve a tutti! Come da titolo ho implementato un mini server HTTP, che ad ogni richiesta TCP in localhost sulla porta 6789 restituisce una semplice pagina HTML ! Appena lanciato il server, e facendo una richiesta da browser (Chrome) la prima volta è andato tutto bene e la scritta "Pagina di esempio" contenuta nell'HTML è stata ricevuta correttamente...POI dalla seconda volta in poi non ha piu funzionato ! Se faccio richieste su "localhost:6789" il browser rimane a schermata bianca senza ritornare nessun errore e lanciando dopo un po un messaggio dicendo che la pagina non risponde!
Vi allego il codice del server
import java.io.*;
import java.net.*;

public class HTTPServer {

	public static void main(String[] args) throws Exception {
		// creazione della socket
		int port = 6789;
		ServerSocket serverSocket = new ServerSocket(port);
		System.err.println("Sever web avviato sulla porta: " + port);

		while (true) {
			Socket clientSocket = serverSocket.accept();
			System.err.println("Nuova richiesta\n");

			BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); // Ricevo Stringhe
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); // E invio stringhe

			String s;
			while ((s = in.readLine()) != null) { // Non -1 perche non sto leggendo BYTE ma STRINGHE
				System.out.println(s);            // Questo meccanismo è valido in caso di connessioni NON persistenti
				if (s.isEmpty()) {
					break;
				}
			}

			out.write("HTTP/1.0 200 OK\r\n");
			out.write("Date: Fri, 31 Dec 1999 23:59:59 GMT\r\n");
			out.write("Server: Apache/0.8.4\r\n");
			out.write("Content-Type: text/html\r\n");
			out.write("Content-Length: 49\r\n");
			out.write("Expires: Sat, 01 Jan 2000 00:59:59 GMT\r\n");
			out.write("Last-modified: Fri, 31 Dic 1999 23:59:59 GMT\r\n");
			out.write("\r\n");
			out.write("<TITLE>Example</TITLE>");
			out.write("<P>Pagina di esempio</P>");
			out.write("\r\n");

			System.err.println("Richiesta terminata\n\n");
			out.flush();
			out.close();
			in.close();
			clientSocket.close();
		}
	}
}
Sinceramente non so cosa possa essere, e sono quasi sicuro che il codice sia giusto, anche perchè è stato visto da un prof della mia università! Unico dubbio che mi rimane è che, all'avvio non mi è stato chiesto nessun permesso di accesso alla rete dell'applicazione, come invece è successo nei pc dei miei compagni! Grazie.

10 Risposte

  • Re: Server HTTP non funziona

    SsaLaroLana ha scritto:


    dalla seconda volta in poi non ha piu funzionato ! Se faccio richieste su "localhost:6789" il browser rimane a schermata bianca senza ritornare nessun errore e lanciando dopo un po un messaggio dicendo che la pagina non risponde!
    Google Chrome sulla console dei Developer Tools mi segnala:
    GET "http://localhost:6789" net::ERR_CONTENT_LENGTH_MISMATCH

    E infatti .... verifica bene, perché il body che stai mandando non è lungo 49!

    Inoltre già che ci sono, ti segnalo che InputStreamReader/OutputStreamWriter usano il charset di "default" della piattaforma, che nel caso di HTTP potrebbe anche non andare bene.
    Gli header HTTP vanno sempre trattati come ASCII mentre il body, se si tratta di contenuto testuale, va codificato secondo un charset che può essere esplicitato (nel content-type) oppure per default se non sbaglio è ISO-8859-1.
  • Re: Server HTTP non funziona

    Guarda, cambdiando il testo nel marcatore di paragrafo, anzi per la precisione allungandolo di una sola lettera , funziona! Sinceramente non capisco bene il perchè di questa cosa, nel senso, tu mi dici che il body non è lungo 49, ed è vero, ma 49 per che cosa sta? Grazie.
  • Re: Server HTTP non funziona

    SsaLaroLana ha scritto:


    tu mi dici che il body non è lungo 49, ed è vero, ma 49 per che cosa sta? Grazie.
    Il Content-Length è la dimensione del body in octets, ovvero 8-bit cioè byte.
  • Re: Server HTTP non funziona

    Ok, ma ancora non capisco cosa stia a significare che "non è lungo 49" ?
  • Re: Server HTTP non funziona

    Significa che nel body stai mandando 48 bytes e non 49 (se conti le lettere del body, infatti, sono 48, non 49), per cui il browser si accorge dell'anomalia e segnala l'errore invece di mostrarne il contenuto.
  • Re: Server HTTP non funziona

    Mi sono spiegato male, allora, che sto mandando 48byte mi è chiaro, ma non capisco cosa cambi al browser se glie ne mando 48 o 49 e perche in un caso funziona mentre nell'altro no!
  • Re: Server HTTP non funziona

    E' un comportamento dipendente dal browser, alcuni semplicemente ignorano i mismatch e mostrano tutto ciò che è stato ricevuto.
    Cosa cambia al browser? Beh il server gli dice "ti manderò 49 byte", mentre alla fine il client ne riceve solo 48, per cui può sospettare che siano avvenuti errori. E' un po' come se ti promettessi di darti 50 euro e te ne dessi solo 10! Un po' ti arrabbieresti, no?
  • Re: Server HTTP non funziona

    Non so se è questo il caso, ma in un protocollo di comunicazione la LEN è un dato importantissimo.
    Per la parte che riceve i dati è fondamentale sapere se la ricezione è completa, ad esempio per calcolare il CRC, prima si ricevono tutti i dati e si bufferizzano, poi si fanno i controlli di errore.
    Ci sono poche eccezioni, ad esempio uno streaming con protocollo udp...
  • Re: Server HTTP non funziona

    Escludi anche l'UDP! Qualunque sia il protocollo, una qualche forma di lunghezza viene SEMPRE implementata!
  • Re: Server HTTP non funziona

    Nel senso che in uno streaming udp un errore o un pacchetto mancante viene ignorato.
Devi accedere o registrarti per scrivere nel forum
10 risposte