一个最简单的 HttpServer


@Slf4j
public class SimpleHttpServer
{
    private static CountDownLatch endSignal = new CountDownLatch(1);

    public static void main(String[] args) {
        try {
            new SimpleHttpServer().start();
            endSignal.await();
        } catch (Throwable e) {
            log.error("failed in SimpleHttpServer main", e);
        }
    }

    public void start() throws Exception {
        HttpServer server = HttpServer.create(new InetSocketAddress(10183), 0);
        server.createContext("/rpl/check", new CheckHandler());
        server.createContext("/rpl/download", new DownloadHandler());
        server.setExecutor(null);
        server.start();
    }

    class CheckHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange httpExchange) throws IOException {
            try {
                String query = httpExchange.getRequestURI().getQuery();
                log.info("received check request: {}", query);

                Map<String, String> params = queryToMap(query);
                for (String key : params.keySet()) {
                    System.out.println(key + " : " + params.get(key));
                }

                String response = "succeed";
                httpExchange.sendResponseHeaders(200, response.length());
                httpExchange.getResponseBody().write(response.getBytes());
                httpExchange.getResponseBody().close();
            } catch (Throwable e) {
                log.error("failed in CheckHandler", e);
                throw e;
            }
        }
    }

    class DownloadHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange httpExchange) throws IOException {
            try {
                String query = httpExchange.getRequestURI().getQuery();
                log.info("received downdload request: {}", query);

                Map<String, String> params = queryToMap(query);
                String filePath = params.get("file");

                // send file
                File file = new File(filePath);
                httpExchange.sendResponseHeaders(200, file.length());
                OutputStream outputStream = httpExchange.getResponseBody();
                Files.copy(file.toPath(), outputStream);
                outputStream.close();
            } catch (Throwable e) {
                log.error("failed in DownloadHandler", e);
                throw e;
            }
        }
    }

    private Map<String, String> queryToMap(String query) {
        Map<String, String> result = new HashMap<>();
        for (String param : query.split("&")) {
            String[] entry = param.split("=");
            if (entry.length > 1) {
                result.put(entry[0], entry[1]);
            }else{
                result.put(entry[0], "");
            }
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值