一、tomcat出发点代码
package com.example.demo.test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
new Server().start();
}
public void start() throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
System.out.println("启动web服务");
while (true) {
socket = serverSocket.accept();
Thread thread = new Thread(new HttpServerThread(socket));
thread.start();
}
}
内部类
private class HttpServerThread implements Runnable {
Socket socket = null;
HttpServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
InputStream is = null;
OutputStream os = null;
BufferedReader br = null;
try {
is = this.socket.getInputStream();
os = this.socket.getOutputStream();
// 页面的请求
br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
int i = 0;
while (null != line && br.ready()) {
line = br.readLine();
System.out.println("第" + i + "行信息:" + line);
i++;
}
// 页面的响应
String reply = "HTTP/1.1\n"; // 必须添加的响应头
reply += "Content-type:text/html; charset=UTF-8\n\n"; // 必须添加的响应头
reply += "服务器返回的消息";
os.write(reply.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
二、出发点扩散,一些扩展应用
既然tomcat是通过socket进行通信的,浏览器或请求模拟器是写数据到socket的。那一切就简单了。
针对写入的这些请求头参数,进行不同的业务处理,类似业务选择器,包含某个请求头就处理,不包含就不处理
(1)keep-alive 保持长长连接
(2)gzip等是进行数据压缩
(3)cookie那是前端或浏览器携带的
(4)cache是前端或浏览器进行处理的
(5)状态码、接受请求referre等都是由服务器进行控制的
三、发散与追究
既然浏览器是通过写数据给服务器、通过socket或其他方式,而服务器也是下发数据给浏览器
那么,这个就不分语言,只要实现这类目的都可以是服务器。如此,服务器不限语言、不限思想、在于
自身如何应用。
既然如此,那如何去确认tomcat在这个原理上有什么过人之处,有时间去看看源码吧。既然如此,
那么,socket又是怎么去调用tcp的呢, http和socket、tcp这个链路又是怎样的?下篇博客见分解