java-httpserver

之前学 Golang, 发现 Golang 自带 Http 服务器, 自己玩的话, 很方便.
但是到 Java 就要引用 tomcat, 感觉很不方便, 就想着自己写个.
结果一百度, 发现java从1.6开始就自带了, 既然如此, 那我就直接使用了.
所以这儿记录下使用过程中的一些东西. 开始里面的知识会很混乱, 以后再整理吧.

jdk 11 中, 在http服务都在 jdk.httpserver 模块中;
分成两个包: com.sun.net.httpserversun.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 协议 ,转载请注明出处!