从零手写Tomcat【之】基础完善,接收与处理信息
1.启动服务,查看浏览器请求信息
- 启动
- 浏览器发起请求
- 查看控制台
2.获取客户端输出流,返回字符串信息给浏览器(失败与原因)
- 获取客户端输出流
- 直接打印信息返回(浏览器并没有反应)
- 原因:Web浏览器发起的
请求(请求行、请求头、换行、请求体)
,应用的是HTTP传输协议
所以,返回的内容,也必须满足协议要求返回格式(响应行、响应头、换行、响应体)
- 请看
3.问题解决
package com.abl.tomcat;
import com.abl.tomcat.util.Log;
import com.abl.tomcat.util.Property;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
/**
* 程序启动入口
*/
public class Start {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(Property.getPort());
Log.info("服务已经启动,端口号:" + Property.getPort() + "\n");
Socket client = null;
BufferedReader reader = null;
PrintWriter writer = null;
//循环监听
while (true) {
try {
client = server.accept();
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
//读取请求地址
String line = reader.readLine();
String[] lines = line.split(" ");
String requestMethod = lines[0];
String requestURI = lines[1];
Log.info("line : " + line);
Log.info("lines : " + Arrays.asList(lines));
Log.info("requestMethod : " + requestMethod);
Log.info("requestURI : " + requestURI + "\n\n");
//获取输出流,拼接返回信息
//获取客户端输出流,返回字符串信息给浏览器
writer = new PrintWriter(client.getOutputStream());
StringBuilder responseStr = new StringBuilder();
responseStr.append("404");
writer.print(responseStr);
writer.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (client != null) {
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
3.问题解决(响应行、响应头)
- 添加响应行、响应头
package com.abl.tomcat;
import com.abl.tomcat.util.Log;
import com.abl.tomcat.util.Property;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
/**
* 程序启动入口
*/
public class Start {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(Property.getPort());
Log.info("服务已经启动,端口号:" + Property.getPort() + "\n");
Socket client = null;
BufferedReader reader = null;
PrintWriter writer = null;
//循环监听
while (true) {
try {
client = server.accept();
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
//读取请求地址
String line = reader.readLine();
String[] lines = line.split(" ");
String requestMethod = lines[0];
String requestURI = lines[1];
Log.info("line : " + line);
Log.info("lines : " + Arrays.asList(lines));
Log.info("requestMethod : " + requestMethod);
Log.info("requestURI : " + requestURI + "\n\n");
//获取输出流,拼接返回信息
//获取客户端输出流,返回字符串信息给浏览器
writer = new PrintWriter(client.getOutputStream());
StringBuilder responseStr = new StringBuilder();
responseStr.append("HTTP/1.1 200 OK\n");//响应行
responseStr.append("content-type:text/html;charset=utf-8\n\n");//响应头
responseStr.append("404");
writer.print(responseStr);
writer.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (client != null) {
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
4.模拟返回 json 与 html
- 请求根路径
/
时,返回 json字符串- 请求
/index
时返回 html 内容
package com.abl.tomcat;
import com.abl.tomcat.util.Log;
import com.abl.tomcat.util.Property;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
/**
* 程序启动入口
*/
public class Start {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(Property.getPort());
Log.info("服务已经启动,端口号:" + Property.getPort() + "\n");
Socket client = null;
BufferedReader reader = null;
PrintWriter writer = null;
//循环监听
while (true) {
try {
client = server.accept();
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
writer = new PrintWriter(client.getOutputStream());
//读取
String line = reader.readLine();
String[] lines = line.split(" ");
String requestMethod = lines[0];
String requestURI = lines[1];
Log.info("line : " + line);
Log.info("lines : " + Arrays.asList(lines));
Log.info("requestMethod : " + requestMethod);
Log.info("requestURI : " + requestURI + "\n\n");
//获取输出流,拼接返回信息
//返回请求信息
StringBuilder responseStr = new StringBuilder();
responseStr.append("HTTP/1.1 200 OK\n");//响应行
if ("/".equals(requestURI)) {
//响应头+换行
responseStr.append("content-type:application/json;charset=utf-8\n\n");
//响应体
responseStr.append("{\"code\":200,\"desc\":\"请求成功,当前为根路径\",\"data\":null}");
} else if ("/index".equals(requestURI)) {
//响应头+换行
responseStr.append("content-type:text/html;charset=utf-8\n\n");
//响应体
responseStr.append("<html>");
responseStr.append("<title>Abl Tomcat</title>");
responseStr.append("<h1> Hello </h1>");
responseStr.append("</html>");
} else {
responseStr.append("content-type:text/html;charset=utf-8\n\n");
responseStr.append("404");//响应体
}
writer.print(responseStr);
writer.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (client != null) {
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
5.本章节源码
《目录:从零手写Tomcat》
《目录:Java设计模式》
《幕》
- 留白 —<老吉>
- ~ 今 ~ ❀ ~ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀