今天来手写一个简单服务器!让你知道例如像tomcat之类的服务器是如何处理浏览器请求响应网页滴!
1.HTTP
http 是 超文本传输协议,有请求,有响应。协议嘛,肯定是一种规定,要传什么什么样的数据。
请求格式是这样滴:
例如:
请求行:GET /index.html HTTP/1.1\n
请求头:HOST:www.baidu.com\n\n
\n
请求体:bulalallalallal
响应格式是这样滴:
例如:
响应行:HTTP/1.1 200 OK\n
响应头:Content-Type:text/html;charset=utf-8\n
\n
响应体:html页面
其实就是TCP/IP发的内容有要求而已
我们开始写一下后端服务器
创建一个普通java项目,创建html文件夹用来放html界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>!!!</title>
</head>
<body>
<h1>MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!MU DA!</h1>
</body>
</html>
src中写一下咱们的服务程序
有注释嗷,我就不分析了
package server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
// 项目html文件系统地址
private static String URL = System.getProperty("user.dir")+File.separator+"html";
public static void main(String[] args) throws IOException {
// 创建服务端socket
ServerSocket serverSocket = new ServerSocket(8080);
while (true){
Socket socket = null;
OutputStream out = null;
InputStream in = null;
try {
// 等待客户端连接
socket = serverSocket.accept();
in = socket.getInputStream();
//读取客户端请求 得到想要请求的html页面文件路径
String url = getUrl(in);
System.out.println(url);
//获取响应内容
String response = getReturnRouse(url);
if (response==null||"".equals(response))
continue;
System.out.println(response);
// 输出流响应
out = socket.getOutputStream();
out.write(response.getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null)
out.close();
if (socket != null)
socket.close();
}
}
}
private static String getUrl(InputStream in) throws IOException {
byte[] b = new byte[2048];
int len = in.read(b);
StringBuilder request = new StringBuilder();
// 通过输入流获取请求内容
for (int i=0;i<len;i++)
request.append((char)b[i]);
// 解析请求,获取想要请求的文件路径
String[] split = request.toString().split("\n");
String[] colm = split[0].split(" ");
return URL+colm[1];
}
private static String getReturnRouse(String url) throws IOException {
if (url.contains("favicon.ico")){
return "";
}
FileInputStream inputStream = new FileInputStream(url);
StringBuilder response = new StringBuilder();
// 拼接HTML响应头部分
response.append("HTTP/1.1 200 OK\n");
response.append("Content-Type:text/html;charset=utf-8\n");
response.append("Server:CUI/1.0\n");
response.append("\n\n");
int read = inputStream.read();
// 文件读取
while (read!=-1){
response.append((char)read);
read = inputStream.read();
}
inputStream.close();
return response.toString();
}
}
拷贝运行试试吧!