请教如何在嵌入式上实现 http server
答案:1 悬赏:30 手机版
解决时间 2021-01-27 21:05
- 提问者网友:相思似海深
- 2021-01-27 16:05
请教如何在嵌入式上实现 http server
最佳答案
- 五星知识达人网友:孤独的牧羊人
- 2021-01-27 17:02
一、使用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代码
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 = "come on baby";
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
Java代码
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
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代码
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 = "come on baby";
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
Java代码
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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯