【转】实现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:
- 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();
- }
- }
- }
【转】实现Http Server的三种方法的更多相关文章
- Sql Server中三种字符串合并方法的性能比较
文章来自:博客园-DotNet菜园 最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.示例:有表內容﹕名称 內容1 abc1 ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- HOSt ip is not allowed to connect to this MySql server, MYSQL添加远程用户或允许远程访问三种方法
HOSt ip is not allowed to connect to this MySql server 报错:1130-host ... is not allowed to connect to ...
- Windows Server 2016-客户端退域的三种方法
前边我们提到了客户端加域的操作方法,本章为大家补充域客户端退域的操作过程,包含图形化.netdom remove.Powershell三种方法,具体内容如下: 图形化退域方法: 1.Win键,计算机右 ...
- 【转】asp.net导出数据到Excel的三种方法
来源:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html 原文出处:http://blog.csdn.net/ ...
- asp.net跳转页面的三种方法比较
目前,对于学习asp.net的很多朋友来讲,实现跳转页面的方法还不是很了解.本文将为朋友们介绍利用asp.net跳转页面的三种方法,并对其之间的形式进行比较,希望能够对朋友们有所帮助. ASP.NET ...
- Asp.Net保存session的三种方法
C#中保存Session的三种方法及Web.Config设置 1.保存session到sql server,需要指定Sql Server服务器,这种方法因为要读写数据库最慢 <sessionSt ...
- Tomcat部署发布JSP应用程序的三种方法 (转)
Tomcat部署发布JSP应用程序的三种方法 1.直接放到Webapps目录下 Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应 ...
- Tomcat 部署项目的三种方法
1.下载 Tomcat 服务器 ①.官网下载地址:http://tomcat.apache.org/ ②.tomcat 8.0 64位百度云下载地址:http://pan.baidu.com/s/1s ...
随机推荐
- python(九):迭代器与生成器
一.Python的迭代协议 迭代器是访问集合内元素的一种方式.它只能依次访问集合内元素.其特点是惰性执行. collection.abc的迭代协议提供了两个概念:可迭代对象和迭代器.可迭代对象:必须具 ...
- 如何在iview组件中使用jsx
最近选用的框架iview表单组件的render写法让人有点不习惯,尤其是在写比较复杂的逻辑的时候,还是感觉模板式的写法比较方便且可读性较强.而render函数除了支持配置写法外,还支持jsx的写法.由 ...
- 使用react——解决this.props.history.push无法跳转的问题
转自: https://blog.csdn.net/yingzizizizizizzz/article/details/78751305 场景: 一个组件中,含有ul展开数组的组件,在每一行中,都能点 ...
- 专访探探DBA张文升:PG在互联网应用中同样也跑的很欢畅
张文升认为,PG无论在可靠性和性能方面都不输其它任何关系型数据库 张文升,探探DBA,负责探探的数据库架构.运维和调优的工作.拥有8年开发经验,曾任去哪儿网DBA. 9月24日,张文升将参加在 ...
- 【JavaScript】闭包应用之数据缓存
最近的开发中的许多事件会被频繁的触发,由于没有做缓存的处理,每次事件触发都会后台调用一样的数据.这几天我突然意识到自己的代码有很大的优化空间,继而想起了闭包可以有缓存的功能,于是乎便对其进行了深入的研 ...
- 网络文学带动的IP热
网络文学从最初被人诟病不入流到现今直接带动整个网络文学产业链发展以及IP热,其发展历程如何?现今布局如何?以下做简单概括. 下图为艾瑞PC指数文学网站排名,由图可看出晋江原创网排名首位. 晋江隶属盛大 ...
- linux 命令行模式下,浏览网页方法
Ubuntu自带最新版的Gnome桌面,拥有大量的服务和桌面应用程序,让您仅通过一张安装光盘就可以体验到无比舒适的操作环境.下文介绍的在ubuntu下使用终端命令行上网的方法. 第一步,需要安装一个名 ...
- Java代码调用存储过程和存储方法
准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar 首先找到你的 oracle 安装位置,例如: 1.创建一个JDBC数据库连接工具类: package com.test.d ...
- windows程序设置开机自动启动
//调用方法:设置开机启动 SetAutoRun(Process.GetCurrentProcess().ProcessName, true, Application.StartupPath + @& ...
- Excel操作之级联菜单
设置级联菜单主要用的是excel的数据验证功能.下面以简单的设置城市选择框为例: 1.准备好数据 2.给所有省份起个名称(例如:省份),然后同样方法给每个省份所对应的城市以其省份命名,(例如:南京.苏 ...