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

HttpExchange:用于获取请求内容以及生成和发送响应。

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

最新文章

  1. sqlserver2008附加数据库时提示“无法为该请求检索数据。 (Microsoft.SqlServer.Management.Sdk.Sfc)”
  2. WCF中的错误及解决办法
  3. Excel数据批量导入到数据库2
  4. atitit.js浏览器环境下的全局异常捕获
  5. HDU 2254
  6. Swift 简单介绍 - 苹果最新的编程语言
  7. tomcat catalina.sh JAVA_OPTS参数说明与配置
  8. GIS制图课程前言
  9. 个人NABCD
  10. 818C.soft thief
  11. NOIP2018总结
  12. Java基础内部类、包的声名、访问修饰符、代码块整理
  13. Round Numbers(数位DP)
  14. EXCEPTION-JS
  15. mysql创建数据库和删除数据库
  16. erlang-百度云推送Android服务端功能实现-erlang
  17. 【洛谷3674】小清新人渣的本愿(莫队,bitset)
  18. Ajax下载
  19. 【Javascript-ECMA6-Fetch详解】
  20. requests利用selenium,代理Ip,云打码,验证码抠图操作 爬取搜狗微信公众号内容

热门文章

  1. 【知识小结】PHP使用svn笔记总结
  2. H3C PPP会话流程
  3. [转]Win10下安装Linux子系统
  4. [转]Java Web工程目录结构
  5. Vue 循环为选中的li列表添加效果
  6. dotnet 使用 GC.GetAllocatedBytesForCurrentThread 获取当前线程分配过的内存大小
  7. 关于better-scroll的使用注意事项
  8. vue-learning:1 - 为什么选择vue
  9. H3C备份/恢复下次启动配置文件
  10. vue 实例未加载完成显示 花括号解决方案