2016-03-21 6 views
1

Я пытаюсь написать простой http-сервер, используя класс com.sun.net.httpserver. Я отправляю html-файл (index.html) в браузер при запуске, но я не знаю, как включить внешний файл css. Он работает, когда код CSS помещается внутри html-файла. Я знаю, что браузер должен отправить запрос, запросив сервер для файла css, но я не уверен, как получить этот запрос и отправить этот файл в браузер. Я добавляю фрагмент моего кода ниже, если это может быть полезно.Как включить файл css с помощью com.sun.net.httpserver?

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

что эта строка кода делает 'server.createContext ("/", новый indexHandler());'? –

+0

Создает http-контекст, связанный с дорожкой «/». Все запросы для этого пути обрабатываются объектом indexHandler. – bizkhit

+0

Если вы хотите написать HTTP-сервер, вам нужно понять, как взаимосвязь между HTTP-запросом и его ответом. Рассказывая, что это будет учебник. – Raedwald

ответ

0

Нет встроенного метода обработки статического содержимого. У вас есть два варианта.

Либо используйте легкий веб-сервер для статического контента, как nginx, но более сложным будет распространение вашего приложения.

Или создайте свои собственные классы обслуживания файлов. Для этого нужно создать новый контекст в вашем веб-сервере:

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

И чем создать класс, который будет обслуживать статические файлы.

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; 
    } 
} 

Для метода getFile (String fileId); вы можете реализовать любой способ получения файла, связанного с fileId. Хорошим вариантом является создание файловой структуры, дублирующей иерархию URL-адресов. Если у вас не так много файлов, вы можете использовать HashMap для хранения правильных пар id-файлов.