实现Http Serve


http://docs.oracle.com/javase/7/docs/api/javax/xml/ws/spi/http/HttpExchange.html


实现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:
    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();   
          }   
      }   
    }  

你可能感兴趣的:(java,http,http,server,client)