java-httpserver
之前学 Golang, 发现 Golang 自带 Http 服务器, 自己玩的话, 很方便.
但是到 Java 就要引用 tomcat, 感觉很不方便, 就想着自己写个.
结果一百度, 发现java从1.6
开始就自带了, 既然如此, 那我就直接使用了.
所以这儿记录下使用过程中的一些东西. 开始里面的知识会很混乱, 以后再整理吧.
包
在 jdk 11
中, 在http服务都在 jdk.httpserver
模块中;
分成两个包: com.sun.net.httpserver
和 sun.net.httpserver
; 至于有什么区别, 回头再看;
刚开始使用, 使用的时候都是使用的 com.sun.net.httpserver
里面的.
自己写的代码
Main.java:
package net.womine.javahttp;
import com.sun.net.httpserver.HttpServer;
import net.womine.javahttp.demo.DemoHandler;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
try {
// 监听端口
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
// 绑定地址
server.createContext("/demo", new DemoHandler());
// 设置服务器线程池对象
server.setExecutor(Executors.newFixedThreadPool(5));
//启动服务
server.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
DemoHandler.java
package net.womine.javahttp.demo;
import com.alibaba.fastjson.JSONObject;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
public class DemoHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
// 打印exchange消息
String exchangeJson = JSONObject.toJSONString(exchange);
// 设置返回消息
byte[] respByte = exchangeJson.getBytes(StandardCharsets.UTF_8);
//设置响应头
exchange.getResponseHeaders().add("Content-Type:", "application/json");
// 设置响应体的长度
exchange.sendResponseHeaders(200, respByte.length);
// 返回消息
OutputStream outputStream = exchange.getResponseBody();
outputStream.write(respByte);
outputStream.flush();
outputStream.close();
}
}
本地调用了一下,
最后返回到页面, 关于 exchange
的json数据:
{
"httpContext": {
"attributes": {},
"filters": [],
"handler": {},
"path": "/demo",
"protocol": "http",
"server": {
"address": {
"address": "0:0:0:0:0:0:0:0",
"port": 8080
},
"executor": {
"activeCount": 1,
"completedTaskCount": 2,
"corePoolSize": 5,
"largestPoolSize": 3,
"maximumPoolSize": 5,
"poolSize": 3,
"queue": [],
"rejectedExecutionHandler": {},
"shutdown": false,
"taskCount": 3,
"terminated": false,
"terminating": false,
"threadFactory": {}
}
}
},
"localAddress": {
"address": "192.168.1.2",
"port": 8080
},
"protocol": "HTTP/1.1",
"remoteAddress": {
"address": "192.168.1.5",
"port": 60976
},
"requestHeaders": {
"Accept-encoding": [
"gzip, deflate"
],
"Accept": [
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
],
"Connection": [
"keep-alive"
],
"Host": [
"192.168.1.2:8080"
],
"Dnt": [
"1"
],
"User-agent": [
"Mozilla/5.0 (Linux; Android 10; MED-AL20 Build/HUAWEIMED-AL20; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36"
],
"Accept-language": [
"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
],
"Upgrade-insecure-requests": [
"1"
],
"X-requested-with": [
"mark.via"
]
},
"requestMethod": "GET",
"requestURI": "/demo",
"responseBody": {},
"responseCode": -1,
"responseHeaders": {}
}
2021-12-08: 光看json, 有的还是不知道, 但是还需要先记录下, 以后再慢慢了解.
想法
如果自己实现 HttpHandler
, 然后再写上 Get
, Post
等等方法, 就实现类似Restful的风格的框架了 φ(゜▽゜*)♪
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!