【轉】實現Http Server的三種方法


一、使用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代碼   收藏代碼
  1. import java.io.IOException;   
  2. import java.io.InputStream;   
  3. import java.io.OutputStream;   
  4. import java.net.InetSocketAddress;   
  5. import com.sun.net.httpserver.HttpExchange;   
  6. import com.sun.net.httpserver.HttpHandler;   
  7. import com.sun.net.httpserver.HttpServer;   
  8. public class MyHTTPServer {   
  9.   public static void main(String[] args)   
  10.   {   
  11.     try {   
  12.       //實現HTTP SERVER   
  13.       HttpServer hs = HttpServer.create(new InetSocketAddress(8888),0);// 設置HttpServer的端口為80   
  14.       hs.createContext("/hujun", new MyHandler());// 用MyHandler類內處理到/的請求   
  15.       hs.setExecutor(null); // creates a default executor   
  16.       hs.start();   
  17.   
  18.       //實現HTTPS SERVER   
  19.       HttpsServer hss = HttpsServer.create(new InetSocketAddress(443),0);  //設置HTTPS端口這443   
  20.       KeyStore ks = KeyStore.getInstance("JKS");   //建立證書庫   
  21.       ks.load(new FileInputStream("證書名" ), "密碼");  //載入證書   
  22.       KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");  //建立一個密鑰管理工廠   
  23.       kmf.init(ks, "密碼");  //初始工廠   
  24.       SSLContext sslContext = SSLContext.getInstance("SSLv3");  //建立證書實體   
  25.       sslContext.init(kmf.getKeyManagers(), null, null);   //初始化證書   
  26.       HttpsConfigurator conf = new HttpsConfigurator(sslContext);  //在https配置   
  27.       hss.setHttpsConfigurator(conf);   //在https server載入配置   
  28.       hss.setExecutor(null); // creates a default executor     
  29.       hss.createContext("/", new MyHandler());// 用MyHandler類內處理到/的請求   
  30.       hss.start();   
  31.     } catch (Exception e){   
  32.       e.printStackTrace();   
  33.     }   
  34.   }   
  35. }   
  36.   
  37. class MyHandler implements HttpHandler {   
  38.   public void handle(HttpExchange t) throws IOException {   
  39.     InputStream is = t.getRequestBody();   
  40.     String response = "<font color='#ff0000'>come on baby</font>";   
  41.     t.sendResponseHeaders(200, response.length());   
  42.     OutputStream os = t.getResponseBody();   
  43.     os.write(response.getBytes());   
  44.     os.close();   
  45.   }   
  46. }   

 

 

 

 

 

二、使用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代碼   收藏代碼
  1. import org.mortbay.http.HttpContext;   
  2. import org.mortbay.http.HttpServer;   
  3. import org.mortbay.http.SocketListener;   
  4. import org.mortbay.http.handler.ResourceHandler;   
  5. public class JettySample {   
  6.   public static void main(String[] args) throws Exception   
  7.   {   
  8.     //創建Jetty HttpServer對象   
  9.     HttpServer server = new HttpServer();   
  10.     //在端口8080上給HttpServer對象綁上一個listener,使之能夠接收HTTP請求   
  11.     SocketListener listener = new SocketListener();   
  12.     listener.setPort(8080);   
  13.     server.addListener(listener);   
  14.      
  15.     //創建一個HttpContext,處理HTTP請求。   
  16.     HttpContext context = new HttpContext();   
  17.     //用setContextPath把Context映射到(/web)URL上。   
  18.     context.setContextPath("/web");   
  19.     //setResourceBase方法設置文檔目錄以提供資源   
  20.     context.setResourceBase("C:\\j2sdk1.4.1_05");   
  21.     //添加資源處理器到HttpContext,使之能夠提供文件系統中的文件   
  22.     context.addHandler(new ResourceHandler());   
  23.     server.addContext(context);   
  24.     //啟動服務器   
  25.     server.start();   
  26.   }   
  27. }   

 

 

Jetty的運行速度較快,而且是輕量級的,可以在Java中可以從test case中控制其運行。從而可以使自動化測試不再依賴外部環境,順利實現自動化測試。 

 

 

 

 

三、使用tomcat embedded 


  Tomcat5中的Embeded版本,為大家在應用中集成完整的Web服務提供了盡可能大的空間,不僅使開發者容易獲得對標准HTTP的處理,還有SSL的通訊處理,使開發者很容易就可以對原有非Web系統進行擴展以支持瘦客戶端應用,通向Web大門的鑰匙已經放在這里,剩下的就是看你怎樣來發揮了。下面是示例代碼: 

 

 

Java代碼   收藏代碼
  1. package tomcat;   
  2. import java.io.File;   
  3. import java.net.InetAddress;   
  4. import org.apache.catalina.Context;   
  5. import org.apache.catalina.Engine;   
  6. import org.apache.catalina.Host;   
  7. import org.apache.catalina.connector.Connector;   
  8. import org.apache.catalina.startup.Embedded;   
  9. public class EmbeddedTomcat {   
  10.   public static void main(String args[]) {   
  11.    try {   
  12.      // Create an embedded server   
  13.      Embedded embedded = new Embedded();   
  14.      String path = new File(".").getCanonicalPath();   
  15.      embedded.setCatalinaHome(path);   
  16.      // Create an engine   
  17.      Engine engine = embedded.createEngine();   
  18.      // Create a default virtual host   
  19.      Host host = embedded.createHost("localhost", path + "/webapps");   
  20.      engine.addChild(host);   
  21.      engine.setDefaultHost(host.getName());   
  22.      // Create the ROOT context   
  23.      Context rootCxt = embedded.createContext("", path + "/webapps/ROOT");   
  24.      rootCxt.setPrivileged(true);   
  25.      host.addChild(rootCxt);   
  26.      // Install the assembled container hierarchy   
  27.      embedded.addEngine(engine);   
  28.      // Assemble and install a default HTTP connector   
  29.      embedded.addConnector(embedded.createConnector(InetAddress.getByName("127.0.0.1"), 8080, false));   
  30.      // Start the embedded server   
  31.      embedded.start();   
  32.    }catch( Exception e ) {   
  33.      e.printStackTrace();   
  34.       }   
  35.   }   
  36. }  
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM