• 纯手写http服务器


    流程
    1. 基于tcp协议封装
    2. 监听某个端口,当请求过来的时候
    3. 根据请求读取某个 **.html文件并返回
    流程图

    在这里插入图片描述

    核心代码
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class HttpTcpServer {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(80);
            System.out.println("http服务器已经启动……");
            while (true) {
                Socket accept = serverSocket.accept();
                new Thread(() -> {
                    OutputStream outputStream = null;
                    FileInputStream fileInputStream = null;
                    try {
                        outputStream = accept.getOutputStream();
                        File file = new File("E:\\custom_http\\index.html");
                        fileInputStream = new FileInputStream(file);
                        byte[] bytes = new byte[1024];
                        int len = fileInputStream.read(bytes);
                        outputStream.write(bytes, 0, len);
                    } catch (Exception e) {
    
                    } finally {
                        try {
                            if(fileInputStream != null) fileInputStream.close();
                            if (outputStream != null) outputStream.close();
                            if (accept != null) accept.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    效果展示

    在这里插入图片描述

    优化
    1. 增加了 根据地址访问不同的页面
    2. 增加了找不到页面报500错误给前端
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class HttpTcpServer {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(80);
            System.out.println("http服务器已经启动……");
            while (true) {
                Socket accept = serverSocket.accept();
                new Thread(() -> {
                    OutputStream outputStream = null;
                    FileInputStream fileInputStream = null;
                    InputStream inputStream = null;
                    try {
                        outputStream = accept.getOutputStream();
                        // 获取用处传过来的页面
                        inputStream = accept.getInputStream();
                        byte[] acceptByte = new byte[1024];
                        int reqLen = inputStream.read(acceptByte);
                        String reqText = new String(acceptByte, 0, reqLen);
                        System.out.println(reqText);
                        String address = reqText.split("\n\r")[0].split(" ")[1];
                        File file = new File("E:\\custom_http" + address);
                        fileInputStream = new FileInputStream(file);
                        byte[] bytes = new byte[1024];
                        int len = fileInputStream.read(bytes);
                        outputStream.write(bytes, 0, len);
                    } catch (Exception e) {
                        e.printStackTrace();
                        try {
                            // 页面报错
                            outputStream.write("500".getBytes());
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    } finally {
                        try {
                            if(fileInputStream != null) fileInputStream.close();
                            if (outputStream != null) outputStream.close();
                            if (accept != null) accept.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    CompletableFuture-链式语法和join方法介绍
    外贸全流程30个邮件模板分享
    LabVIEW性能和内存管理 1
    OMV6 安装Extras 插件失败的解决方法
    50年前,Hello World发明者第一次提交的Go代码长这样……
    跨越障碍:解决复杂网页数据提取的挑战
    合盖计算机后,外接显示器不休眠
    LQ0264 鲁卡斯队列【精度计算】
    Python单元测试内置库uinttest使用介绍
    Bean容器里的单例是根据什么识别它是同一个类呢?(比如容器里创建了A类,再去用这个A类的时候,Bean容器怎么知道这个就是A类?)
  • 原文地址:https://blog.csdn.net/ITzhongzi/article/details/126718479