2016-05-03 7 views
0

Ich lerne den Code aus dem ersten Beispiel von.Was ist die dritte Anfrage, von der serversockt akzeptiert?

hier ist die index.html

<html> 
    <head> 
    <title>Welcome to BrainySoftware</title> 
    </head> 
    <body> 
    <img src="./images/logo.gif"> 
    <br> 
    Welcome to BrainySoftware. 
    </body> 
</html> 

Ich weiß, es 2 GET-Anforderung ist. Zuerst ist der HTML, der zweite ist der IMG. Aber ich bekomme manchmal die dritte Anfrage. Die dritte Anfrage ist leer, ich kann nichts von der Anfrage bekommen.

ServerSocket serverSocket = null; 
int port = 8080; 
try { 
    serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1")); 
} 
catch (IOException e) { 
    e.printStackTrace(); 
    System.exit(1); 
} 
while (!shutdown) { 
     Socket socket = null; 
     InputStream input = null; 
     OutputStream output = null; 
     try { 
     socket = serverSocket.accept(); 
     input = socket.getInputStream(); 
     output = socket.getOutputStream(); 

     // create Request object and parse 
     Request request = new Request(input); 
     request.parse(); 

     // create Response object 
     Response response = new Response(output); 
     response.setRequest(request); 
     response.sendStaticResource(); 

     // Close the socket 
     socket.close(); 

     //check if the previous URI is a shutdown command 
     shutdown = request.getUri().equals(SHUTDOWN_COMMAND); 
     } 
     catch (Exception e) { 
     e.printStackTrace(); 
     continue; 
     } 
    } 

Wenn die dritte Anfrage kommt, sendStaticResource die Methode eine Ausnahme werfen:
java.lang.NullPointerException because request.getUri() is null. Meine jdk Version ist 1.7, wenn ich die InetAddress 127.0.0.1-192.168.50.132 ändern, verschwand die dritte Anfrage. Ich habe keine Ahnung, warum nicht 2 Anfragen, bitte helfen Sie mir.

+1

Haben Sie versucht, einen Breakpoint in einem Debugger zu setzen und zu überprüfen, was kommt? Es könnte ein HEAD anstelle einer GET-Anfrage sein, wobei nach den Fähigkeiten des Servers oder nach anderen Eigenschaften einer Datei gesucht wird - z. die "letzte Änderungszeit". –

+0

Ja, ich habe versucht.Es hat Anfrage 3 mal: ①GET /index.html HTTP/1.1 ② "" ③GET /images/logo.gif HTTP/1.1 –

+0

@TomEast Ich bezweifle, es könnte einige sein [Browser Prefetching] (https : //developers.google.com/speed/articles/prefetching) Optimierung, die zu einer zusätzlichen Anforderung führt. Was ist der Browser, den Sie verwenden? Kannst du es mit einem anderen Browser versuchen? –

Antwort

1

Wenn Sie Verbindungen von der Welt akzeptieren, gibt es keine Möglichkeit Sie können den verbindenden Browser beschuldigen "einen Fehler zu haben". Selbst wenn es hat: Ihre Verantwortung, um mit was auch immer Daten zu behandeln, die Sie von draußen erhalten. Es kann Ausnahmen geben, die beim Verarbeiten dieser Anfragen ausgelöst werden, aber Sie fangen sie besser und behandeln sie. Wenn überhaupt, Ihr Code muss mit alles befassen, die zu ihm geworfen wird.

Der Code, den Sie veröffentlichen, scheint dies zu tun - aber da er zu einfach ist, behandelt er keine nicht erwarteten Ergebnisse. Stattdessen stößt es nur Stacktraces aus - der Eindruck entsteht, dass etwas schief gelaufen ist. Ich verstehe, dass Sie nicht noch einen weiteren Handler für HTTP implementieren werden - das wäre ein gut abgedecktes Territorium - sondern eher daran interessiert, die Konzepte zu testen.

Zurück zu dem, was diese Anfragen verursacht: Es ist schwer aus der Ferne zu sagen, ohne diesen Code auszuführen und auch hier alles zu tun. Wie ich in einem Kommentar sage, sollten Sie die fragliche Anfrage und die damit verbundenen Daten in einem Debugger untersuchen. Und denken Sie daran, dass HTTP auf den ersten Blick sehr einfach aussieht, aber die Spezifikation enthält viele Details, die Sie in diesem sehr einfachen Verbindungshandler komplett weglassen - Verbindung-Keep-Alive kommt mir in den Sinn: Eine physische Verbindung kann mehrere virtuelle enthalten Verbindungen (lesen: HTTP-Anfragen).

Verwandte Themen