利用Java怎么模拟一个http服务器

  介绍

利用Java怎么模拟一个http服务器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

在Java中可以使用HttpServer类来实现http服务器,该类位于com.sun.net包下(rt.jar)。实现代码如下:

<强>主程序类

包bg.httpserver;
  
  进口com.sun.net.httpserver.HttpServer;
  进口java.io.IOException;
  进口java.net.InetSocketAddress;
  进口java.util.concurrent.Executors;
  
  公开课HttpServerStarter {
  公共静态void main (String [] args)抛出IOException {//创建一个HttpServer实例,并绑定到指定的IP地址和端口号
  HttpServer HttpServer=HttpServer。创造(新的InetSocketAddress (8080), 0);//创建一个HttpContext,将路径为/myserver请求映射到MyHttpHandler处理器
  httpServer.createContext (“/myserver",新的MyHttpHandler ());//设置服务器的线程池对象
  httpServer.setExecutor (Executors.newFixedThreadPool (10));//启动服务器
  httpServer.start ();
  }
  }

HttpServer: HttpServer主要是通过带参的制造方法来创建,第一个参数InetSocketAddress表示绑定的ip地址和端口号第。二个参数为int类型,表示允许排队的最大TCP连接数,如果该值小于或等于零,则使用系统默认值。

createContext:可以调用多次,表示将指定的url路径绑定到指定的HttpHandler处理器对象上,服务器接收到的所有路径请求都将通过调用给定的处理程序对象来处理。

setExecutor:设置服务器的线程池对象,不设置或者设为空则表示使用开始方法创建的线程。

<强> HttpHandler实现

包bg.httpserver;
  
  进口com.sun.net.httpserver.Headers;
  进口com.sun.net.httpserver.HttpExchange;
  进口com.sun.net.httpserver.HttpHandler;
  进口java.io.BufferedReader;
  进口java.io.InputStreamReader;
  进口java.io.OutputStream;
  进口并不知道;
  进口java.util.Map;
  进口java.util.stream.Collectors;/* *
  *处理/myserver路径请求的处理器类
  */公共类MyHttpHandler实现HttpHandler {
  @Override
  公共空间处理(HttpExchange HttpExchange) {
  尝试{
  StringBuilder responseText=new StringBuilder ();
  responseText.append(“请求方法:“).append (httpExchange.getRequestMethod ()) .append (“& lt; br/在“);
  responseText.append(“请求参数:“).append (getRequestParam (httpExchange)) .append (“& lt; br/在“);
  responseText.append(“请求头:& lt; br/在“).append (getRequestHeader (httpExchange));
  handleResponse (httpExchange responseText.toString ());
  }捕捉(例外的前女友){
  ex.printStackTrace ();
  }
  }/* *
  *获取请求头
  * @param httpExchange
  * @return
  */私人字符串getRequestHeader (HttpExchange HttpExchange) {
  标题标题=httpExchange.getRequestHeaders ();
  返回headers.entrySet () .stream ()
  . map (Map.Entry<字符串,List比;条目)→entry.getKey () +“:“.toString + entry.getValue () ())
  .collect (Collectors.joining (“& lt; br/在“));
  }/* *
  *获取请求参数
  * @param httpExchange
  * @return
  * @throws例外
  */私人字符串getRequestParam (HttpExchange HttpExchange)抛出异常{
  字符串paramStr=?“;
  
  如果(httpExchange.getRequestMethod () .equals (“GET")) {//得到请求读字串
  .getQuery paramStr=httpExchange.getRequestURI () ();
  其他}{//非得到请求读请求体
  BufferedReader BufferedReader=new BufferedReader(新InputStreamReader (httpExchange.getRequestBody (),“utf-8"));
  StringBuilder requestBodyContent=new StringBuilder ();
  字符串行=零;
  在((=bufferedReader.readLine行())!=null) {
  requestBodyContent.append(线);
  }
  paramStr=requestBodyContent.toString ();
  }
  
  返回paramStr;
  }/* *
  *处理响应
  * @param httpExchange
  * @param responsetext
  * @throws例外
  */私人空间handleResponse (HttpExchange HttpExchange,字符串responsetext){抛出异常//生成html
  StringBuilder responseContent=new StringBuilder ();
  responseContent.append (“& lt; html>“)
  .append (“& lt; body>“)
  .append (responsetext)
  .append (“& lt;/body>“)
  .append (“& lt;/html>“);
  字符串responseContentStr=responseContent.toString ();
  byte [] responseContentByte=responseContentStr.getBytes (“utf-8");//设置响应头,必须在sendResponseHeaders方法之前设置!
  httpExchange.getResponseHeaders阀门()(“内容类型:“,“text/html; charset=utf-8");//设置响应码和响应体长度,必须在getResponseBody方法之前调用!
  httpExchange。responseContentByte.length sendResponseHeaders (200);
  
  OutputStream=httpExchange.getResponseBody ();
  out.write (responseContentByte);
  out.flush ();
  out.close ();
  }
  }

利用Java怎么模拟一个http服务器