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的网页内容

相关推荐
斑马13921 分钟前
Linux软件编程学习笔记(十二)——TCP并发服务器模型
java·服务器·网络
冬栈程序设计25 分钟前
Springboot宿舍管理系统【670099】 -附源码(开箱即用)
java·毕业设计·springboot·课程设计·程序设计·大作业
2601_9622845033 分钟前
北京Java全栈开发培训 Web前端开发 软件测试就业培训班
java·软件测试·web前端·全栈开发·就业培训
ControlRookie1 小时前
第22篇_源码加更 04|chunked 解码器和十六进制块长度解析
http·codesys·plc通信·开源源码
qiaosaifei1 小时前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟1 小时前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python
文子越来越强1 小时前
【双因子认证】拦截注解@MFACheck 接入指南(其他微服务如何用)
java
ZGG0032 小时前
线程池详解:从 7 大参数到生产避坑
java·数据库·后端
迪康Defender2 小时前
公用电脑责任追溯难?迪康端点安全一体化管理系统用户模式详解
java·运维·开发语言·网络·其他·安全
AI备忘录2 小时前
(十九)华为华三锐捷迈普思科 交换机链路聚合配置命令(LACP/静态聚合五厂商对照)
运维·服务器·网络·网络协议·tcp/ip·华为