2016-03-21 12 views
1

Ich versuche, einen einfachen HTTP-Server mit com.sun.net.httpserver Klasse zu schreiben. Ich sende HTML-Datei (index.html) beim Start in den Browser, aber ich weiß nicht, wie eine externe CSS-Datei enthalten ist. Es funktioniert, wenn css-Code innerhalb der HTML-Datei platziert wird. Ich weiß, dass der Browser eine Anfrage senden sollte, fragen Server für CSS-Datei, aber ich bin mir nicht sicher, wie diese Anfrage erhalten und diese Datei an den Browser zurücksenden. Ich füge unten ein Fragment meines Codes bei, wenn es hilfreich sein könnte.Wie kann ich CSS-Datei mit com.sun.net.httpserver aufnehmen?

private void startServer() 
{ 
    try 
    { 
     server = HttpServer.create(new InetSocketAddress(8000), 0); 
    } 
    catch (IOException e) 
    { 
     System.err.println("Exception in class : " + e.getMessage()); 
    } 
    server.createContext("/", new indexHandler()); 
    server.setExecutor(null); 
    server.start(); 
} 

private static class indexHandler implements HttpHandler 
{ 
    public void handle(HttpExchange httpExchange) throws IOException 
    { 
     Headers header = httpExchange.getResponseHeaders(); 
     header.add("Content-Type", "text/html"); 
     sendIndexFile(httpExchange);    
    } 
} 

static private void sendIndexFile(HttpExchange httpExchange) throws IOException 
{ 
    File indexFile = new File(getIndexFilePath()); 
    byte [] indexFileByteArray = new byte[(int)indexFile.length()]; 

    BufferedInputStream requestStream = new BufferedInputStream(new FileInputStream(indexFile)); 
    requestStream.read(indexFileByteArray, 0, indexFileByteArray.length); 

    httpExchange.sendResponseHeaders(200, indexFile.length()); 
    OutputStream responseStream = httpExchange.getResponseBody(); 
    responseStream.write(indexFileByteArray, 0, indexFileByteArray.length); 
    responseStream.close(); 
} 
+0

was diese Codezeile tut 'server.createContext ("/", new indexHandler());'? –

+0

Es erstellt einen HTTP-Kontext, der dem Pfad "/" zugeordnet ist. Alle Anforderungen für diesen Pfad werden vom indexHandler-Objekt verarbeitet. – bizkhit

+0

Wenn Sie einen HTTP-Server schreiben möchten, müssen Sie verstehen, wie die Beziehung zwischen einer HTTP-Anfrage und ihrer Antwort aussieht. Ihnen zu sagen, das würde zu einem Tutorial führen. – Raedwald

Antwort

0

Es gibt keine integrierte Methode zur Verarbeitung statischer Inhalte. Sie haben zwei Möglichkeiten.

Verwenden Sie einen leichten Webserver für statische Inhalte wie nginx, aber die Verteilung Ihrer Anwendung wird schwieriger.

Oder erstellen Sie Ihre eigenen File Serving-Klassen. Dafür haben Sie einen neuen Kontext in Ihrem Web-Server zu erstellen:

int port = 8080; 
HttpServer server = HttpServer.create(new InetSocketAddress(port), 0); 
// ... more server contexts 
server.createContext("/static", new StaticFileServer()); 

Und als die Klasse erstellen, die Ihre statischen Dateien dienen.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.OutputStream; 

import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 

@SuppressWarnings("restriction") 
public class StaticFileServer implements HttpHandler { 

    @Override 
    public void handle(HttpExchange exchange) throws IOException { 
     String fileId = exchange.getRequestURI().getPath(); 
     File file = getFile(fileId); 
     if (file == null) { 
      String response = "Error 404 File not found."; 
      exchange.sendResponseHeaders(404, response.length()); 
      OutputStream output = exchange.getResponseBody(); 
      output.write(response.getBytes()); 
      output.flush(); 
      output.close(); 
     } else { 
      exchange.sendResponseHeaders(200, 0); 
      OutputStream output = exchange.getResponseBody(); 
      FileInputStream fs = new FileInputStream(file); 
      final byte[] buffer = new byte[0x10000]; 
      int count = 0; 
      while ((count = fs.read(buffer)) >= 0) { 
       output.write(buffer, 0, count); 
      } 
      output.flush(); 
      output.close(); 
      fs.close(); 
     } 
    } 

    private File getFile(String fileId) { 
     // TODO retrieve the file associated with the id 
     return null; 
    } 
} 

Für die Methode getFile (String fileId); Sie können beliebige Methoden zum Abrufen der Datei implementieren, die der Datei-ID zugeordnet ist. Eine gute Option besteht darin, eine Dateistruktur zu erstellen, die die URL-Hierarchie widerspiegelt. Wenn Sie nicht viele Dateien haben, können Sie eine HashMap verwenden, um gültige ID-Dateipaare zu speichern.