Java 自身实现 Http 服务(无第三方)

面试时候遇到的笔试题,要求不依赖任何第三方库或框架(只使用 jdk 里面包含的公开可用的类库),tomcat 属于第三方框架所以不要用,com.sun 下的也不要用,开发一个 http 服务
Java 开发文档中已经提供完整的方式,英文教程

{阅读原文](https://aidanblog.top/2021/09/01/Interview-code-NativeHttpService/)

具体流程:

  1. 使用 ServerSocket 对客户端进行监听
  2. 接收 http,解析数据
  3. 提供服务并响应

这里做一个算术运算的服务,地址

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by Aidan on 2021/8/31 21:24
 * GitHub: github.com/huaxin0304
 * Blog: aidanblog.top
 */

/*
题目要求:
不依赖任何第三方库或框架(只使用 jdk 里面包含的公开可用的类库),tomcat 属于第三方框架所以不要用,com.sun 下的也不要用,开发一个 http 服务:
做加法运算:计算参数 a 和参数 b 的算术和,在浏览器地址栏里输入 `http://localhost:port/add?a=4&b=7`,浏览器窗口中显示 11
做乘法运算:计算参数 a 和参数 b 的算术乘积,在浏览器地址栏里输入`http://localhost:port/mult?a=4&b=7`,浏览器窗口中显示28
*/
public class HttpService {
    public static Integer result = 0;

    public static void main(String[] args) {
        try {

            // 监听端口号,只要是8888就能接收到
            ServerSocket ss = new ServerSocket(8888);

            // 实例化客户端,固定套路,通过服务端接受的对象,生成相应的客户端实例
            Socket socket = ss.accept();
            // 获取客户端输入流,就是请求过来的基本信息:请求头,换行符,请求体
            BufferedReader bd = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            /**
             * 接受HTTP请求,并解析数据
             */
            String requestHeader;
            if ((requestHeader = bd.readLine()) != null && !requestHeader.isEmpty()) {
                System.out.println(requestHeader);
                /**
                 * 方法处理代码
                 */
                int start = requestHeader.indexOf("?") + 3;
                int terminal = requestHeader.indexOf("&");
                String num1 = requestHeader.substring(start, terminal);
                int space = requestHeader.indexOf("HTTP") - 1;
                String num2 = requestHeader.substring(terminal + 3, space);
                System.out.println(num1 + num2);
                // 加法
                if (requestHeader.contains("add")) {
                    result = Integer.parseInt(num1) + Integer.parseInt(num2);
                }
                // 乘法
                else if (requestHeader.contains("mult")) {
                    result = Integer.parseInt(num1) * Integer.parseInt(num2);
                }
            }
            // 发送回执
            PrintWriter pw = new PrintWriter(socket.getOutputStream());

            pw.println("HTTP/1.1 200 OK");
            pw.println("Content-type:text/html");
            pw.println();
            pw.println("<h1>" + result + "</h1>");

            pw.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值