永发信息网

请教如何在嵌入式上实现 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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯