一、使用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:
- 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
- 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);
- //創建一個HttpContext,處理HTTP請求。
- HttpContext context = new HttpContext();
- //用setContextPath把Context映射到(/web)URL上。
- context.setContextPath("/web");
- //setResourceBase方法設置文檔目錄以提供資源
- context.setResourceBase("C:\\j2sdk1.4.1_05");
- //添加資源處理器到HttpContext,使之能夠提供文件系統中的文件
- context.addHandler(new ResourceHandler());
- server.addContext(context);
- //啟動服務器
- server.start();
- }
- }
Jetty的運行速度較快,而且是輕量級的,可以在Java中可以從test case中控制其運行。從而可以使自動化測試不再依賴外部環境,順利實現自動化測試。
三、使用tomcat embedded
Tomcat5中的Embeded版本,為大家在應用中集成完整的Web服務提供了盡可能大的空間,不僅使開發者容易獲得對標准HTTP的處理,還有SSL的通訊處理,使開發者很容易就可以對原有非Web系統進行擴展以支持瘦客戶端應用,通向Web大門的鑰匙已經放在這里,剩下的就是看你怎樣來發揮了。下面是示例代碼:
- package tomcat;
- import java.io.File;
- import java.net.InetAddress;
- import org.apache.catalina.Context;
- import org.apache.catalina.Engine;
- import org.apache.catalina.Host;
- import org.apache.catalina.connector.Connector;
- import org.apache.catalina.startup.Embedded;
- public class EmbeddedTomcat {
- public static void main(String args[]) {
- try {
- // Create an embedded server
- Embedded embedded = new Embedded();
- String path = new File(".").getCanonicalPath();
- embedded.setCatalinaHome(path);
- // Create an engine
- Engine engine = embedded.createEngine();
- // Create a default virtual host
- Host host = embedded.createHost("localhost", path + "/webapps");
- engine.addChild(host);
- engine.setDefaultHost(host.getName());
- // Create the ROOT context
- Context rootCxt = embedded.createContext("", path + "/webapps/ROOT");
- rootCxt.setPrivileged(true);
- host.addChild(rootCxt);
- // Install the assembled container hierarchy
- embedded.addEngine(engine);
- // Assemble and install a default HTTP connector
- embedded.addConnector(embedded.createConnector(InetAddress.getByName("127.0.0.1"), 8080, false));
- // Start the embedded server
- embedded.start();
- }catch( Exception e ) {
- e.printStackTrace();
- }
- }
- }