Java 如何实现一个http服务器

作者:自律给我自由 时间:2022-03-27 05:40:04 

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

主程序类


package bg.httpserver;

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

public class HttpServerStarter {
 public static void main(String[] args) throws IOException {
   //创建一个HttpServer实例,并绑定到指定的IP地址和端口号
   HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0);

//创建一个HttpContext,将路径为/myserver请求映射到MyHttpHandler处理器
   httpServer.createContext("/myserver", new MyHttpHandler());

//设置服务器的线程池对象
   httpServer.setExecutor(Executors.newFixedThreadPool(10));

//启动服务器
   httpServer.start();
 }
}

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

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

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

HttpHandler实现


package bg.httpserver;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
* 处理/myserver路径请求的处理器类
*/
public class MyHttpHandler implements HttpHandler {
 @Override
 public void handle(HttpExchange httpExchange) {
   try {
     StringBuilder responseText = new StringBuilder();
     responseText.append("请求方法:").append(httpExchange.getRequestMethod()).append("<br/>");
     responseText.append("请求参数:").append(getRequestParam(httpExchange)).append("<br/>");
     responseText.append("请求头:<br/>").append(getRequestHeader(httpExchange));
     handleResponse(httpExchange, responseText.toString());
   } catch (Exception ex) {
     ex.printStackTrace();
   }
 }

/**
  * 获取请求头
  * @param httpExchange
  * @return
  */
 private String getRequestHeader(HttpExchange httpExchange) {
   Headers headers = httpExchange.getRequestHeaders();
   return headers.entrySet().stream()
               .map((Map.Entry<String, List<String>> entry) -> entry.getKey() + ":" + entry.getValue().toString())
               .collect(Collectors.joining("<br/>"));
 }

/**
  * 获取请求参数
  * @param httpExchange
  * @return
  * @throws Exception
  */
 private String getRequestParam(HttpExchange httpExchange) throws Exception {
   String paramStr = "";

if (httpExchange.getRequestMethod().equals("GET")) {
     //GET请求读queryString
     paramStr = httpExchange.getRequestURI().getQuery();
   } else {
     //非GET请求读请求体
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpExchange.getRequestBody(), "utf-8"));
     StringBuilder requestBodyContent = new StringBuilder();
     String line = null;
     while ((line = bufferedReader.readLine()) != null) {
       requestBodyContent.append(line);
     }
     paramStr = requestBodyContent.toString();
   }

return paramStr;
 }

/**
  * 处理响应
  * @param httpExchange
  * @param responsetext
  * @throws Exception
  */
 private void handleResponse(HttpExchange httpExchange, String responsetext) throws Exception {
   //生成html
   StringBuilder responseContent = new StringBuilder();
   responseContent.append("<html>")
       .append("<body>")
       .append(responsetext)
       .append("</body>")
       .append("</html>");
   String responseContentStr = responseContent.toString();
   byte[] responseContentByte = responseContentStr.getBytes("utf-8");

//设置响应头,必须在sendResponseHeaders方法之前设置!
   httpExchange.getResponseHeaders().add("Content-Type:", "text/html;charset=utf-8");

//设置响应码和响应体长度,必须在getResponseBody方法之前调用!
   httpExchange.sendResponseHeaders(200, responseContentByte.length);

OutputStream out = httpExchange.getResponseBody();
   out.write(responseContentByte);
   out.flush();
   out.close();
 }
}

运行HttpServerStarter,在浏览器中访问如下:

Java 如何实现一个http服务器

来源:https://www.cnblogs.com/seve/p/12192245.html

标签:java,http,服务器
0
投稿

猜你喜欢

  • java 如何判断是否是26个英文字母

    2023-11-29 15:51:59
  • JavaWeb项目部署到服务器详细步骤详解

    2023-11-29 11:15:20
  • android图片处理 让图片变成圆形

    2023-10-03 00:47:30
  • java对象初始化代码详解

    2023-09-19 13:59:01
  • Java求最小生成树的两种算法详解

    2023-11-10 07:21:24
  • Idea Jrebel 报错:Cannot reactivate,offline seat in use

    2022-01-11 05:08:22
  • GSON实现Java对象与JSON格式对象相互转换的完全教程

    2023-11-23 09:23:37
  • 浅谈Spring中Bean的作用域、生命周期

    2023-11-14 02:44:21
  • MyBatis找不到mapper文件的实现

    2023-12-15 09:22:11
  • IDEA解决springboot热部署失效问题(推荐)

    2023-08-12 10:40:49
  • 手把手带你了解Java-Stream流方法学习及总结

    2023-11-25 19:30:15
  • Swagger实现动态条件注入与全局拦截功能详细流程

    2023-11-23 13:41:05
  • Java集合定义与用法实例总结【Set、List与Map】

    2023-11-21 08:26:40
  • 基于java构造方法Vector删除元素源码分析

    2023-11-25 14:54:45
  • SpringBoot自动装配原理详解

    2023-07-26 08:44:46
  • Mybatis-Plus 多表联查分页的实现代码

    2023-11-25 04:59:07
  • Android Studio中通过CMake使用NDK并编译自定义库和添加预编译库

    2023-06-16 10:31:35
  • Spring中自动注入的两种方式总结

    2022-10-24 08:54:14
  • Mybatis-Plus使用updateById()、update()将字段更新为null

    2023-11-26 01:53:42
  • Mybatis日志模块的适配器模式详解

    2023-11-26 12:45:32
  • asp之家 软件编程 m.aspxhome.com