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版权协议,转载请附上原文出处链接和本声明。