简易版自制http

简易版自制http

TCP

创建服务两个重要对象:
服务器端:ServerSocket 指定固定的端口
客户端:Socket 构建方法里面直接填写服务器端的IP和端口
读写对象:
读取对象:BufferedReader – readline
写入对象:BufferedWritter – write
遵循http协议 注意request和response 4部分

步骤

  1. 创建一个 tcp 服务器
    用ServerSocket
 ServerSocket serverSocket = new ServerSocket(prot);
  1. 等待客户端连接
  Socket socket = serverSocket.accept();
  1. 得到读写对象 进行读写操作
   BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  • 读取首行信息 并用空格分隔首行,后依次读取请求方法类型URLHTTP 版本号
            //读取首行信息 readLine
            String fistline = reader.readLine();
            if (fistline != null && !fistline.equals(" ")) {
                //用空格分割首行
                String[] fline = fistline.split(" ");
                //读取到请求方法的类型
                String method = fline[0];
                //读取到URL
                String url = fline[1];
                //读取到HTTP 版本号
                String httpVer = fline[2];
                System.out.println(String.format("读取到客户端请求,方法类型:%s,URL:%s,版本:%s",
                        method, url, httpVer));
             }
  1. 业务逻辑处理
                String content = "<h1>未知</h1>";
                if (url.contains("404")) {
                    content= "<h1>没有找到此页面</h1>";
                }else if (url.contains("200")) {
                    content = "<h1>你好,世界!</h1>";
                }else if(url.contains("500")) {
                    content = "<h1>服务器内部错误</h1>";
                }
  1. 将结果打印到浏览器上
  • 注意格式 要严格按照http response头格式打印 注意打印完后加 \n 换行符
  • 首行 版本号,状态码,状态码描述
  • head 里面必须要有 返回的类型Content-Type/charset/
    还有Content-length 注意这个是字节码的长度
  • 空行
  • body 也就是上面写的content (GET请求方式,body没有值;POST请求方式,body有值)
  • 写完记得刷新缓冲区
                //写入首行信息
                writer.write(httpVer +" 200 ok\n");
                //写入head(返回的类型Content-Type/charset/Content-length 这个是字节码的长度)
                writer.write("Content-Type:text/html;charset=utf-8\n");
                writer.write("Content-Length:"+content.getBytes().length+"\n");
                //写入空行
                writer.write("\n");
                //写入body (content)
                writer.write(content);
                writer.flush();

总体代码实现

public class CustomHTTP {
    private static final int prot = 9005;

    public static void main(String[] args) throws IOException {
        //1.创建一个 TCP 服务器
        ServerSocket serverSocket = new ServerSocket(prot);
        System.out.println("服务器已启动");
        //2.等待客户端连接
        Socket socket = serverSocket.accept();
        //3.得到读写对象 进行读写操作
        try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())))
        {
            //读取首行信息 readLine
            String fistline = reader.readLine();
            if (fistline != null && !fistline.equals(" ")) {
                //用空格分割首行
                String[] fline = fistline.split(" ");
                //读取到请求方法的类型
                String method = fline[0];
                //读取到URL
                String url = fline[1];
                //读取到HTTP 版本号
                String httpVer = fline[2];
                /*System.out.println(String.format("读取到了客户端请求信息,方法类型:%s,URL:%s,版本号:%s",
                        method,url,httpVer));*/
                System.out.println(String.format("读取到客户端请求,方法类型:%s,URL:%s,版本:%s",
                        method, url, httpVer));
                //4.业务逻辑处理
                String content = "<h1>未知</h1>";
                if (url.contains("404")) {
                    content= "<h1>没有找到此页面</h1>";
                }else if (url.contains("200")) {
                    content = "<h1>你好,世界!</h1>";
                }else if(url.contains("500")) {
                    content = "<h1>服务器内部错误</h1>";
                }
                //5.将结果打印到浏览器上
                //写入首行信息
                writer.write(httpVer +" 200 ok\n");
                //写入head(返回的类型Content-Type/charset/Content-length 这个是字节码的长度)
                writer.write("Content-Type:text/html;charset=utf-8\n");
                writer.write("Content-Length:"+content.getBytes().length+"\n");
                //写入空行
                writer.write("\n");
                //写入body (content)
                writer.write(content);
                writer.flush();
            }
        }

    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值