2016-03-21 93 views
1

我想写一个简单的http服务器,使用com.sun.net.httpserver类。我在启动时向浏览器发送html文件(index.html),但我不知道如何包含外部css文件。它工作时,CSS代码放在HTML文件。我知道,该浏览器应发送请求,要求服务器的css文件,但我不知道如何接收此请求并将此文件发送回浏览器。如果可能会有所帮助,我会在下面附上我的代码片段。如何使用com.sun.net.httpserver包含css文件?

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(“/”,new indexHandler());'? –

+0

它创建一个与路径“/”关联的http上下文。此路径的所有请求都由indexHandler对象处理。 – bizkhit

+0

如果要编写HTTP服务器,则需要了解HTTP请求与其响应之间的关系。告诉你这将相当于一个教程。 – Raedwald

回答

0

没有用于处理静态内容的内置方法。你有两个选择。

要么使用像nginx这样的静态内容的轻量级网络服务器,但比分配应用程序更困难。

或创建您自己的文件服务类。为此,您必须在您的Web服务器中创建一个新的上下文:

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文件对。