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