【转】实现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.       //实现HTTPS SERVER
  18.       HttpsServer hss = HttpsServer.create(new InetSocketAddress(443),0);  //设置HTTPS端口这443
  19.       KeyStore ks = KeyStore.getInstance("JKS");   //建立证书库
  20.       ks.load(new FileInputStream("证书名" ), "密码");  //载入证书
  21.       KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");  //建立一个密钥管理工厂
  22.       kmf.init(ks, "密码");  //初始工厂
  23.       SSLContext sslContext = SSLContext.getInstance("SSLv3");  //建立证书实体
  24.       sslContext.init(kmf.getKeyManagers(), null, null);   //初始化证书
  25.       HttpsConfigurator conf = new HttpsConfigurator(sslContext);  //在https配置
  26.       hss.setHttpsConfigurator(conf);   //在https server载入配置
  27.       hss.setExecutor(null); // creates a default executor
  28.       hss.createContext("/", new MyHandler());// 用MyHandler类内处理到/的请求
  29.       hss.start();
  30.     } catch (Exception e){
  31.       e.printStackTrace();
  32.     }
  33.   }
  34. }
  35. class MyHandler implements HttpHandler {
  36.   public void handle(HttpExchange t) throws IOException {
  37.     InputStream is = t.getRequestBody();
  38.     String response = "<font color=‘#ff0000‘>come on baby</font>";
  39.     t.sendResponseHeaders(200, response.length());
  40.     OutputStream os = t.getResponseBody();
  41.     os.write(response.getBytes());
  42.     os.close();
  43.   }
  44. }

二、使用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.     //创建一个HttpContext,处理HTTP请求。
  15.     HttpContext context = new HttpContext();
  16.     //用setContextPath把Context映射到(/web)URL上。
  17.     context.setContextPath("/web");
  18.     //setResourceBase方法设置文档目录以提供资源
  19.     context.setResourceBase("C:\\j2sdk1.4.1_05");
  20.     //添加资源处理器到HttpContext,使之能够提供文件系统中的文件
  21.     context.addHandler(new ResourceHandler());
  22.     server.addContext(context);
  23.     //启动服务器
  24.     server.start();
  25.   }
  26. }

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. }
时间: 2024-08-11 01:23:36

【转】实现Http Server的三种方法的相关文章

转:访问 Microsoft SQL Server 元数据的三种方法

上海微创软件有限公司 肖桂东 适用读者:Microsoft SQL Server 中.高级用户 元数据简介 元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者再简单一点就是"关于数据的信息",日常生活中的图例.图书馆目录卡和名片等都可以看作是元数据.在关系型数据库管理系统 (DBMS) 中,元数据描述了数据的结构和意义.比如在管理.维护 SQL Server 或者是开发数据库应用程序的时候,我们经常要获取一些涉及到数据库架构的信息:某个数据库中

Sql Server删除数据表中重复记录 三种方法

本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1.生成一张临时表new_users,表结构与users表一样:2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录:3.把users表改为其它的名称,把new_use

Sql Server中三种字符串合并方法的性能比较

最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.        示例:        有表內容﹕        名称  內容         1     abc        1      aaa        1      dddd        2      1223        2       fkdjfd           --------------------------------        结果﹕        1 

Windows Server 2016-客户端退域的三种方法

前边我们提到了客户端加域的操作方法,本章为大家补充域客户端退域的操作过程,包含图形化.netdom remove.Powershell三种方法,具体内容如下: 图形化退域方法: 1.Win键,计算机右键属性: 2.系统界面在计算机名称.域和工作组设置栏选择"更改设置": 3.在系统属性界面,选择"更改": 4.在更改界面隶属于框选择工作组并键入要加入的工作组信息,并确定: 5.提示"离开域后,您需要知道本地管理员账户的密码才能登录到计算机.单击"

防止sql注入的三种方法

常用的避免SQL注入的三种方法 一,存储过程 在学习数据库视频的时候接触过,它是存储在数据库中的一些事先编译好的指令.在用的时候不用重新编写,直接调用就好了.所以,使用它可以大大提高程序的执行效率. 那么,如果创建一个存储程序并使用它呢?这是我们今天要解决的问题 1.创建过程 可编程性--下拉菜单--存储过程--右键--查询菜单--指定模板参数的值--新建查询--输入语句--查询菜单中的分析检查语法是否正确--执行 2.具体创建语法 在创建存储程序时,为了应对各种变换的数据,通常会涉及到带参数的

将项目部署到tomcat的三种方法

2014年8月初8    星期五 又到星期五了,可以轻松的敲点东西,不担心睡太晚起不来,或者起来后上班打瞌睡. 由于近期学习了solr相关的知识,部署solr项目到tomcat上的方式很多,包括官方的等.我自己也找了中非官方的方法,感觉很好.而且以前用MyEclipse开发,出错很少,现在用Eclipse所以部署项目后在后台调用user.dir的时候出错,试了一下午也没事出来,而且越试越想试,但是带我的人不让我弄了,他帮我弄,让我干其他任务,我都怀疑是不是他也和我一样就喜欢干这种事情,所以自己去

shell执行三种方法

查看当前shell echo $SHELL grep root /etc/passwd 开头: #!/bin/bash #!/bin/sh ls -l /bin/sh shell种类 cat /etc/shells /etc/init.d/nfs /etc/init.d/crond /etc/init.d/rc.d/rc.sysinit bash --version shell执行三种方法: 1,sh t.s 或者 shell t.s 2,/server/scripts/t.sh 或者 ./t.

tomcat部署项目三种方法

1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的一种Tomcat项目部署的方法,也是初学者最常用的方法. 2.在tomcat安装目录中有一个conf文件夹,打开此文件夹,其中包含配置文件server.xml,打开配置文件,并在<host>和</host>之间插入如下语句. <Context    path="/hello"   docBase="F:\eclipse3.2\workspace\hello\WebRoot

Tomcat项目部署的三种方法

第一种方法如下:直接把我们的项目文件夹放到tomcat里面,在这里我自己做的是一个测试项目oa,如图 启动tomcat,打开浏览器,输入localhost/oa  即可打开你的文件,注意 :访问的时候,如果我们没有定位到具体的页面,会自动去找一个叫做index.html的页面,如图,这里我是改了80默认的端口.所以浏览器中就直接不输入 第二种方法如下:在server.xml里面进行配置首先将之前的项目文件oa移动到随便的磁盘里,我是把它移动到了E盘中, Path这个名字就是你要在刘浏览器中进行输