手写一个简单服务器

今天来手写一个简单服务器!让你知道例如像tomcat之类的服务器是如何处理浏览器请求响应网页滴!

1.HTTP
http 是 超文本传输协议,有请求,有响应。协议嘛,肯定是一种规定,要传什么什么样的数据。

请求格式是这样滴:
例如:
请求行:GET /index.html HTTP/1.1\n
请求头:HOST:www.baidu.com\n\n
\n
请求体:bulalallalallal

响应格式是这样滴:
例如:
响应行:HTTP/1.1 200 OK\n
响应头:Content-Type:text/html;charset=utf-8\n
\n
响应体:html页面

其实就是TCP/IP发的内容有要求而已

我们开始写一下后端服务器

创建一个普通java项目,创建html文件夹用来放html界面
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>!!!</title>
</head>
<body>
    <h1>MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!</h1>
</body>
</html>

src中写一下咱们的服务程序
有注释嗷,我就不分析了

package server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    // 项目html文件系统地址
    private static String URL = System.getProperty("user.dir")+File.separator+"html";

    public static void main(String[] args) throws IOException {
        // 创建服务端socket
        ServerSocket serverSocket = new ServerSocket(8080);

        while (true){
            Socket socket = null;
            OutputStream out = null;
            InputStream in = null;
            try {
                // 等待客户端连接
                socket = serverSocket.accept();

                in = socket.getInputStream();

                //读取客户端请求 得到想要请求的html页面文件路径
                String url = getUrl(in);

                System.out.println(url);

                //获取响应内容
                String response = getReturnRouse(url);

                if (response==null||"".equals(response))
                    continue;

                System.out.println(response);
                // 输出流响应
                out = socket.getOutputStream();

                out.write(response.getBytes());
                out.flush();

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (out != null)
                    out.close();
                if (socket != null)
                    socket.close();
            }
        }
    }

    private static String getUrl(InputStream in) throws IOException {
        byte[] b = new byte[2048];
        int len = in.read(b);

        StringBuilder request = new StringBuilder();
        // 通过输入流获取请求内容
        for (int i=0;i<len;i++)
            request.append((char)b[i]);
        // 解析请求,获取想要请求的文件路径
        String[] split = request.toString().split("\n");
        String[] colm = split[0].split(" ");

        return URL+colm[1];
    }

    private static String getReturnRouse(String url) throws IOException {
        if (url.contains("favicon.ico")){
            return "";
        }

        FileInputStream inputStream = new FileInputStream(url);

        StringBuilder response = new StringBuilder();

        // 拼接HTML响应头部分
        response.append("HTTP/1.1 200 OK\n");
        response.append("Content-Type:text/html;charset=utf-8\n");
        response.append("Server:CUI/1.0\n");
        response.append("\n\n");

        int read = inputStream.read();

        // 文件读取
        while (read!=-1){
            response.append((char)read);
            read = inputStream.read();
        }

        inputStream.close();

        return response.toString();
    }
}

拷贝运行试试吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值