基於Java實現Http服務器有多種多樣的方法
一種輕量級的方式是使用JDK內置的com.sun.net.httpserver包下和sun.net.httpserver包下類提供的方法構建,該方法輕便快捷。
import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.sun.net.httpserver.HttpServer; /** * @author 作者 E-mail: * @version 創建時間:2015-10-24 下午04:51:40 類說明 */ public class HttpServerManager { private final static HttpServerManager instance = new HttpServerManager(); private HttpServer httpServer = null; private ExecutorService executor = null; private HttpServerManager() { } public final static HttpServerManager getInstance() { return instance; } public final void init() throws IOException { this.executor = Executors.newCachedThreadPool(); final InetSocketAddress sa = new InetSocketAddress("0.0.0.0", 8080); this.httpServer = HttpServer.create(sa, 0); this.httpServer.setExecutor(this.executor); this.httpServer.createContext("/", new HttpServerHandler()); this.httpServer.start(); } public final void exit() { this.executor.shutdown(); this.httpServer.stop(0); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URI; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.ssl.HttpsURLConnection; /** * @author 作者 E-mail: * @version 創建時間:2015-10-24 下午05:02:25 類說明 */ public class HttpServerHandler implements HttpHandler { public void onError(HttpExchange exchange) throws IOException { exchange.sendResponseHeaders(HttpsURLConnection.HTTP_BAD_REQUEST,0); exchange.getResponseBody().close(); } public static String getQueryString(HttpExchange exchange) throws IOException { if (exchange.getRequestMethod().equalsIgnoreCase("GET")) { return exchange.getRequestURI().getQuery(); } String requestBodyString = getRequestBodyString(exchange); if (requestBodyString.length() == 0) { return exchange.getRequestURI().getQuery(); } return requestBodyString; } public static String getRequestBodyString(HttpExchange exchange) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(exchange.getRequestBody(), "UTF-8")); StringBuilder builder = new StringBuilder(); String line = null; while ((line = br.readLine()) != null) { builder.append(line); } return builder.toString(); } @SuppressWarnings("deprecation") @Override public void handle(HttpExchange exchange) throws IOException { OutputStream os = null; final URI uri = exchange.getRequestURI(); //http://127.0.0.1:8080/cmd/helloWorld final String path = uri.getPath(); final String query = getQueryString(exchange); final Headers responseHeaders = exchange.getResponseHeaders(); // 返回結果 final byte[] result = new byte[] { ' ', ' ' }; responseHeaders.set("Content-Type", "text/plain"); responseHeaders.set("Content-length", String.valueOf(result.length)); exchange.sendResponseHeaders(HttpsURLConnection.HTTP_OK, 0); os = exchange.getResponseBody(); os.write(result); os.close(); } }
再舉一個使用jdk自帶httpserver組件的例子:
import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.concurrent.Executors; import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; //在eclipse中會出現Access restriction: The type Headers is not accessible due to restriction on required library //解決辦法:把Windows-Preferences-Java-Complicer- Errors/Warnings里面的Deprecated and restricted API中的Forbidden references(access rules)選為Warning就可以編譯通過。 /** * 使用jdk自帶sun httpserver組件構建Http服務器, * JDK自帶的HttpServer是一個非常輕量級的Http服務端框架,但是它非常靈活,易於擴展, * @author Administrator * */ public class HttpServerDemo { public static void main(String[] args) throws IOException { InetSocketAddress addr = new InetSocketAddress(8080); HttpServer server = HttpServer.create(addr, 0); server.createContext("/", new MyHandler()); server.setExecutor(Executors.newCachedThreadPool()); server.start(); System.out.println("Server is listening on port 8080"); } } class MyHandler implements HttpHandler { public void handle(HttpExchange exchange) throws IOException { String requestMethod = exchange.getRequestMethod(); System.out.println("處理新請求:"+requestMethod); if (requestMethod.equalsIgnoreCase("GET")) { Headers responseHeaders = exchange.getResponseHeaders(); responseHeaders.set("Content-Type", "text/plain"); exchange.sendResponseHeaders(200, 0); OutputStream responseBody = exchange.getResponseBody(); Headers requestHeaders = exchange.getRequestHeaders(); Set<String> keySet = requestHeaders.keySet(); Iterator<String> iter = keySet.iterator(); while (iter.hasNext()) { String key = iter.next(); List values = requestHeaders.get(key); String s = key + " = " + values.toString() + "\n"; responseBody.write(s.getBytes()); } responseBody.close(); } } }