JSD-2204-API-创建Maven项目-WebServer(项目)-Day10

1.创建Maven项目

第一步:左上角File->new->Project...

第二步:选择Maven工程点击Next

第三步:在Name旁边写项目名称WebServer点击Next

创建好的Maven项目目录就是这个样子 

 

 打开pom.xml文件

未修改之前:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>WebServer</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    

</project>

修改以后是:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>WebServer</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>


    <properties>
        <!-- 设置 JDK 版本为 1.8 -->
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <!-- 设置编码为 UTF-8 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
    </properties>

</project>

 注意:改好了吧idea大退出一下

打开此电脑->C:\用户\(你自己电脑的用户名)\.m2

选择上述文件加,默认里面缺少一个settings.xml文件,需要配置一下

settings.xml:

<?xml version="1.0" encoding="UTF-8"?>

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

	<pluginGroups>
	</pluginGroups>

	<proxies>
	</proxies>

	<servers>
	</servers>

	<mirrors>

		<mirror>
			<id>ali</id>
			<name>ali Maven</name>
			<mirrorOf>*</mirrorOf>
			<url>https://maven.aliyun.com/repository/public/</url>
		</mirror>

	</mirrors>
	<profiles>

	</profiles>
	<activeProfiles>
	</activeProfiles>



</settings>

 可以创建一个文件,将文件全称修改为:settings.xml 就可以了

让后打开idea:

 选择Maven选项

选择左上角的刷新按钮刷新一下,等idea下载Maven库完毕以后,就可以开始做项目了

2.V1(版本)

新建一个Modeu起名为V1

2.1项目目录

2.1.1WebServerApplication类(启动类)

代码:

package com.webserver.core;

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

/**
 * WebServer主类
 * WebServer是一个Web容器,实现了Tomcat的基础功能。
 * 通过本次项目我们的目标是:
 * 1:理解Tomcat底层工作原理
 * 2:理解HTTP协议的规定
 * 3:理解SpringBoot
 */
public class WebServerApplication {
    private ServerSocket serverSocket;

    /**
     * 初始化WebServer
     */
    public WebServerApplication(){
        try {
            System.out.println("正在启动服务端...");
            /*
                当端口被其他程序占用时,这里会抛出异常:
                java.net.BindException:address already in use:JVM
                解决:
                1:杀死该java进程(推荐)
                2:重启电脑(不推荐)
                3:更换端口(通常重启后还不行,说明被其他程序占用该端口了)
             */
            serverSocket = new ServerSocket(8088);
            System.out.println("服务端启动完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 服务端开始工作的方法
     */
    public void start(){
        try {
            System.out.println("等待客户端连接...");
            Socket socket = serverSocket.accept();
            System.out.println("一个客户端连接了!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        WebServerApplication webServerApplication = new WebServerApplication();
        webServerApplication.start();
    }
}

3.V2(版本)

HTTP协议要求浏览器连接服务端后应当发送一个请求,因此本版本实现读取请求并输出到控制台来了解请求
的格式和内容。

实现:
由于服务端可以同时接收多客户端的连接,因此与聊天室相同,主线程仅负责接受客户端的连接,一旦一个
客户端连接后则启动一个线程来处理。
1:在com.webserver.core下新建类:ClientHandler(实现Runnable接口),作为线程任务。
  工作是负责与连接的客户端进行HTTP交互
2:WebServerApplication主线程接收连接后启动线程执行ClientHandler这个任务处理客户端交互
3:在ClientHandler中读取客户端发送过来的内容(请求内容)并打桩输出

3.1项目目录 

3.1.1 ClientHandler

代码:

package com.webserver.core;

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

/**
 * 该线程任务是负责与一个客户端进行一次HTTP交互
 * 浏览器与服务端交互组从一问一答的原则。因此服务端处理一次HTTP交互,步骤如下:
 * 1:解析请求(接受浏览器发送过来的请求内容)
 * 2:处理请求(根据浏览器发送的请求理解其意图并进行对应的处理)
 * 3:发送响应(将处理结果发送给浏览器)
 *
 *
 */
public class ClientHandler implements Runnable{
    private Socket socket;
    public ClientHandler(Socket socket){
        this.socket = socket;
    }

    public void run() {
        try {
            //通过socket获取输入流
            InputStream in = socket.getInputStream();
            int d ;
            /*
                HTTP协议要求浏览发送过来的内容除了含附件这类除外的其余内容
                都是纯文字,并且字符都是英文,数字,符号,他们的共同特点是
                在asc中为单字节编码。因此没读取一个字节就可以当作一个char。
             */
            while((d = in.read()) != -1){
                System.out.print((char)d);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

 3.1.2WebServerApplication类(启动类)

没有修改任何代码

4.V3(版本)

解析请求
HTTP协议要求客户端连接后会发送一个请求,每个请求由三部分构成:
请求行 消息头 消息正文

首先请求行和消息头有一个共同的特点:都是以CRLF结尾的一行字符串.
因此先实现读取一行字符串的操作,测试将请求行读取出来并进行解析.之后可以再利用这个
操作完成消息头的读取并解析.

实现:
在ClientHandler中完成读取一行字符串的操作.

4.1项目目录 

4.1.1 ClientHandler(修改)

代码:

package com.webserver.core;

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

/**
 * 该线程任务是负责与一个客户端进行一次HTTP交互
 * 浏览器与服务端交互组从一问一答的原则。因此服务端处理一次HTTP交互,步骤如下:
 * 1:解析请求(接受浏览器发送过来的请求内容)
 * 2:处理请求(根据浏览器发送的请求理解其意图并进行对应的处理)
 * 3:发送响应(将处理结果发送给浏览器)
 *
 *
 */
public class ClientHandler implements Runnable{
    private Socket socket;
    public ClientHandler(Socket socket){
        this.socket = socket;
    }

    public void run() {
        try {
            InputStream in = socket.getInputStream();
            int d ;
            char cur='a',pre='a';//cur表示本次读取的字符,pre表示上次读取的字符
            StringBuilder builder = new StringBuilder();
            while((d = in.read()) != -1){
                cur = (char)d;//本次读取到的字符
                if(pre==13&&cur==10){//是否连续读取了回车+换行
                    break;
                }
                builder.append(cur);
                pre = cur;//在进行下一轮读取前,要将本次读取的字符记作"上次读取的字符"
            }
            String line = builder.toString().trim();//获取拼接好的一行字符串内容
            System.out.println(line);

            //请求行的相关信息
            String method;//请求方式
            String uri;//抽象路径
            String protocol;//协议版本
            //将请求行按照空格拆分为三部分,并赋值给三个变量
            String[] data = line.split("\\s");
            method = data[0];
            uri = data[1];
            protocol = data[2];
            //测试路径:http://localhost:8088/myweb/index.html
            System.out.println("method:"+method);//method:GET
            System.out.println("uri:"+uri);//uri:/myweb/index.html
            System.out.println("protocol:"+protocol);//protocol:HTTP/1.1


        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

版权声明:本文为TheNewSystrm原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。