DIY-Tomcat part 2 实现Processor和Connector以及测试所用TestClient

实现Processor

java 复制代码
package Webserver.src.processor;

import java.io.IOException;

import Webserver.src.connector.Request;
import Webserver.src.connector.Response;

public class StaticProcessor {

    public void process(Request request, Response response) {
        try {
            response.sendStaticResource();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
  • 访问静态资源
  • 简单的调用response中的sendStaticResource即可

实现Connector

java 复制代码
package Webserver.src.connector;

import java.io.Closeable;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import Webserver.src.processor.StaticProcessor;

public class Connector implements Runnable{
    
    private static final int DEFAULT_PORT = 8888;

    private ServerSocket server;
    private int port;
	//绑定端口
    public Connector() {
        this(DEFAULT_PORT);
    }

    public Connector(int port) {
        this.port = port;
    }

    public void start() {
    //创建线程并启动该线程,会自动调用线程中的run方法
        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void run() {
        try {
        //创建服务器socket
            server = new ServerSocket(port);
            System.out.println("启动服务器,监听端口:" + port);
		//BIO式建立网络间通讯
            while (true) {
            //server.accept会阻塞直到链接成功建立
                Socket socket = server.accept();
                InputStream input = socket.getInputStream();
                OutputStream output = socket.getOutputStream();
			//创建Request并解析HTTP请求头中的uri
                Request request = new Request(input);
                request.parse();
			//创建Response并绑定request以获取uri
                Response response = new Response(output);
                response.setRequest(request);
			//调用process读取文件内容并输出到输出流中
                StaticProcessor processor = new StaticProcessor();
                processor.process(request, response);
			//及时关闭socket节省服务器资源
                close(socket);
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        } finally {
        //最后确保关闭服务器,节省资源
            close(server);
        }
    }

    private void close(Closeable closeable) {
        if (closeable != null) {
            try {
                closeable.close();  
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }
}
  • 建立了个BIO模型的网络间通讯服务器
  • 调用process将请求的文件内容输出到输出流中

实现客户端TestClient以及服务器端Bootstrap

TestClient

java 复制代码
package Webserver.src.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TestClient {
    
    public static void main(String[] args) throws UnknownHostException, IOException {
    //建立socket监听主机:"localhost" 端口:8888
        Socket socket = new Socket("localhost", 8888);
        OutputStream output = socket.getOutputStream();
        //发送HTTP请求并及时关闭输出流,节省资源
        output.write("GET /index.html HTTP/1.1".getBytes());
        socket.shutdownOutput();
		//读入输入中的内容并输出
        InputStream input = socket.getInputStream();
        byte [] buffer = new byte[2048];
        int length = input.read(buffer);
        StringBuilder response = new StringBuilder();
        for (int i = 0; i < length; i ++) {
            response.append((char)buffer[i]);
        }
        System.out.println(response.toString());
        socket.shutdownInput();
		//关闭socket,关闭客户端
        socket.close();
    }
}
  • 建立客户端
  • 接受客户端传入的消息并打印

Bootstrap

java 复制代码
package Webserver.src;

import Webserver.src.connector.Connector;

public class Bootstrap {
    
    public static void main(String[] args) {
        Connector connector = new Connector();
        connector.start();
    }
}
  • 启动服务器端
  • 等待客户端连接和解析其发送的请求

测试结果

先后启动服务器端以及客户端

  • 可见成功返回200 OK的HTTP响应头和请求的文件内容

启动服务器端并在web浏览器上发送请求

  1. 发送http://localhost:8888/index.html请求

成功返回对应的网页内容

  1. 发送不合法的请求

成功返回File not found的网页内容

相关推荐
程序员黑豆4 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年5 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅5 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
小席是个热心肠5 小时前
AI相关的自我学习
java·人工智能·学习
数智化管理手记8 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29148 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统9 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
0x5310 小时前
Java网络编程(二)
java·服务器·网络
AI领路人.10 小时前
[特殊字符] 用 OpenClaw 实现一个 C++ 复刻版 QuantClaw
websocket·单元测试·discord·rest api·内存占用·c++17
微硬创新10 小时前
老旧产线改造:耐达讯自动化16路4‑20mA转PROFINET的工程实践
人工智能·网络协议·自动化·信息与通信