實現Http Serve 一、使用SUN公司在JDK6中提供的新包com.sun.net.httpserver
JDK6提供了一個簡單的Http Server API,據此我們可以構建自己的嵌入式Http Server,它支援Http和Https協議,提供了HTTP1.1的部分實現,沒有被實現的那部分可以通過擴充已有的Http Server API來實現,程式員必須自己實現HttpHandler介面,HttpServer會調用HttpHandler實作類別的回調方法來處理用戶端請求,在這裡,我們把一個Http請求和它的響應稱為一個交換,封裝成HttpExchange類,HttpServer負責將HttpExchange傳給HttpHandler實作類別的回調方法.
實現Http Server
實現Http Server比較簡單,我就不我做解釋,只要看下面的代碼就能明白。
實現Https Server
HTTPS是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,SSL 使用認證來進行驗證。對於需要使用 SSL 來保證通訊安全的用戶端和伺服器,都必須建立認證。JSSE 使用的認證要用與 J2SE 一起發布的 Java keytool 來建立。用下列命令來為 HTTP 伺服器建立一個 RSA 認證。
prompt> keytool -genkey -keystore serverkeys -keyalg rsa -alias qusay
這個命令會產生一個由別名 qusay 引用的認證,並將其儲存在一個名為 serverkeys 的檔案中。產生認證的時候,這個工具會提示我們輸入一些資訊。
下面代碼示範了怎樣建立自己的Http Server 和Https Server:
Java代碼 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; public class MyHTTPServer { public static void main(String[] args) { try { //實現HTTP SERVER HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);// 設定HttpServer的連接埠為80 hs.createContext("/hujun", new MyHandler());// 用MyHandler類內處理到/的請求 hs.setExecutor(null); // creates a default executor hs.start(); //實現HTTPS SERVER HttpsServer hss = HttpsServer.create(new InetSocketAddress(443),0); //設定HTTPS連接埠這443 KeyStore ks = KeyStore.getInstance("JKS"); //建立認證庫 ks.load(new FileInputStream("認證名" ), "密碼"); //載入認證 KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); //建立一個密鑰管理工廠 kmf.init(ks, "密碼"); //初始工廠 SSLContext sslContext = SSLContext.getInstance("SSLv3"); //建立認證實體 sslContext.init(kmf.getKeyManagers(), null, null); //初始化認證 HttpsConfigurator conf = new HttpsConfigurator(sslContext); //在https配置 hss.setHttpsConfigurator(conf); //在https server載入配置 hss.setExecutor(null); // creates a default executor hss.createContext("/", new MyHandler());// 用MyHandler類內處理到/的請求 hss.start(); } catch (Exception e){ e.printStackTrace(); } } } class MyHandler implements HttpHandler { public void handle(HttpExchange t) throws IOException { InputStream is = t.getRequestBody(); String response = "<font color='#ff0000'>come on baby</font>"; t.sendResponseHeaders(200, response.length()); OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); } }
二、使用Jetty
Jetty 是一個開源的servlet容器,它為基於Java的web內容,例如JSP和servlet提供運行環境。Jetty是使用Java語言編寫的,它的API以一組JAR包的形式發布。開發人員可以將Jetty容器執行個體化成一個對象,可以迅速為一些獨立運行(stand-alone)的Java應用提供網路和web串連。
需要最少的包:
commons-logging.jar
javax.servlet.jar
org.mortbay.jetty.jar
org.mortbay.jmx.jar
下面直接看代碼,以嵌入模式啟動Jetty,目前貌似不支援HTTPS
Java代碼 import org.mortbay.http.HttpContext; import org.mortbay.http.HttpServer; import org.mortbay.http.SocketListener; import org.mortbay.http.handler.ResourceHandler; public class JettySample { public static void main(String[] args) throws Exception { //建立Jetty HttpServer對象 HttpServer server = new HttpServer(); //在連接埠8080上給HttpServer對象綁上一個listener,使之能夠接收HTTP請求 SocketListener listener = new SocketListener(); listener.setPort(8080); server.addListener(listener);