资讯专栏INFORMATION COLUMN

com.sun.net.httpserver 创建 web 服务

VishKozus / 552人阅读

摘要:今天我瞎翻的源代码,发现可以用包下提供的很快速的创建服务,它的创建方式和极其的类似。创建服务创建服务并注册前面创建的,使用来处理请求。使用默认的只要运行这个方法,一个服务就启动了,监听端口是,下面是我写了两个完整的例子。

我最开始学习 Java web 编程是要去写一个 servlet, 重写里面的 service 方法,然后去配置 web.xml 文件,最后就是部署到 tomcat 或者 jetty 容器中并启动。后来就是使用一些框架,struts2 SpringMvc。今天我瞎翻 JDK 的源代码,发现可以用 com.sun.net.httpserver 包下提供的 API 很快速的创建 web 服务,它的创建方式和 golang 极其的类似。

HttpHandler

首先要实现 HttpHandler, 重写 handle 方法。

public class MyHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange httpExchange) throws IOException {
    
    }
}
创建 web 服务

创建 web 服务并注册前面创建的 handler,使用 handler 来处理请求。

public class Main {

    public static void main(String[] args) {
        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
            server.createContext("/web", new MyHandler());
            // 使用默认的 excutor
            server.setExecutor(null);
            server.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

只要运行这个 main 方法,一个 web 服务就启动了,监听端口是 8000, 下面是我写了两个完整的例子。

GetHandler
package me.deweixu.handler;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import netscape.javascript.JSObject;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;

/**
 * Created by simeone
 *
 * @author: simeone
 * @Date: 2018/5/19
 */
public class GetHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange httpExchange) throws IOException {
        System.out.println("Method: " + httpExchange.getRequestMethod());
        String param = httpExchange.getRequestURI().getQuery();
        System.out.println("Param:" + param);
        httpExchange.sendResponseHeaders(200, 0);

        OutputStream os = httpExchange.getResponseBody();
        os.write(param.getBytes());
        os.close();
    }

}
PostHandler
package me.deweixu.handler;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.UnsupportedEncodingException;

/**
 * Created by simeone
 *
 * @author: simeone
 * @Date: 2018/5/19
 */
public class PostHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange httpExchange) throws IOException {
        System.out.println("Method: " + httpExchange.getRequestMethod());

        InputStream is = httpExchange.getRequestBody();
        String response = is2string(is);
        System.out.println("response: " + response);
        is.close();
        httpExchange.sendResponseHeaders(200, response.length());

        Headers headers = httpExchange.getResponseHeaders();
        headers.set("Content-Type", "application/json; charset=utf8");

        OutputStream os = httpExchange.getResponseBody();
        os.write(response.getBytes());
        os.close();
    }

    private String is2string(InputStream is) throws IOException {
        final int bufferSize = 1024;
        final char[] buffer = new char[bufferSize];
        final StringBuilder out = new StringBuilder();
        Reader in = new InputStreamReader(is, "UTF-8");
        for (; ; ) {
            int rsz = in.read(buffer, 0, buffer.length);
            if (rsz < 0)
                break;
            out.append(buffer, 0, rsz);
        }
        return out.toString();
    }
}
Main
package me.deweixu;

import com.sun.net.httpserver.HttpServer;
import me.deweixu.handler.GetHandler;
import me.deweixu.handler.PostHandler;

import java.io.IOException;
import java.net.InetSocketAddress;

public class Main {

    public static void main(String[] args) {
        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
            server.createContext("/post", new PostHandler());
            server.createContext("/get", new GetHandler());
            server.setExecutor(null);
            server.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
测试
# get
$ curl http://127.0.0.1:8000/get?name=simeone&address=beijing
name=simeone&address=beijing

# post
$ curl -H "Content-Type: application/json" -d "{"username":"simeone", "address":"beijing"}" http://127.0.0.1:8000/post
{"username":"simeone", "address":"beijing"}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69429.html

相关文章

  • 全栈通用分页查询

    摘要:前言给大家讲解全栈通用分页查询码字不易,点个关注转载请说明开发工具思维导图目录一所需要的包二后端数据库帮助类通用查询分页父类书籍层类分页工具类三前端文件助手类前端界面四一所需要的包二后端数据库 前言:给大家讲解全栈通用分页查询 码字不易,点个关注 转载请说明! 开发工具:eclipse 思维...

    Ashin 评论0 收藏0
  • Spring 指南(目录)

    摘要:指南无论你正在构建什么,这些指南都旨在让你尽快提高工作效率使用团队推荐的最新项目版本和技术。使用进行消息传递了解如何将用作消息代理。安全架构的主题指南,这些位如何组合以及它们如何与交互。使用的主题指南以及如何为应用程序创建容器镜像。 Spring 指南 无论你正在构建什么,这些指南都旨在让你尽快提高工作效率 — 使用Spring团队推荐的最新Spring项目版本和技术。 入门指南 这些...

    only_do 评论0 收藏0
  • web前端和后端的区别在哪?

    摘要:前端和后端是计算机行业最常用的两个术语在某种程度上,它们成了流行语。前端开发人员也称为前端设计师,他们可以创建一个没有任何后端开发的站点。 前端和后端是计算机行业最常用的两个术语;在某种程度上,它们成了流行语。它们决定了你作为软件开发人员的工作类型、你使用的技术以及你得到的报酬。那么,让我们来谈谈这两个术语之间的区别,它们...

    xuxueli 评论0 收藏0
  • IntelliJ IDEA2017创建web工程并实现远程部署tomcat

    摘要:刚刚接触这款神器,很多东西都在摸索中,对于像在及中创建动态工程那样简单的事在中也搞了好久,今天我就分享一下本菜鸟痛苦的学习过程,下面是我的总结,希望对大家有一点帮助。远程部署运行测试或到服务器上看一下 刚刚接触IntelliJ IDEA这款神器,很多东西都在摸索中,对于像在eclipse及myeclipse中创建动态web工程那样简单的事在idea中也搞了好久,今天我就分享一下本菜鸟痛...

    chunquedong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<