zoukankan      html  css  js  c++  java
  • 【转】实现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. }  
     
     
     
     
     
  • 相关阅读:
    7月的尾巴,你是XXX
    戏说Android view 工作流程《下》
    “燕子”
    Android开机动画bootanimation.zip
    戏说Android view 工作流程《上》
    ViewController里已连接的IBOutlet为什么会是nil
    My first App "Encrypt Wheel" is Ready to Download!
    iOS开发中角色Role所产生的悲剧(未完)
    UIScrollView实现不全屏分页的小技巧
    Apple misunderstood my app,now my app status changed to “In Review”
  • 原文地址:https://www.cnblogs.com/exmyth/p/7524440.html
Copyright © 2011-2022 走看看