http协议-服务端解析封装http数据-小案例
This commit is contained in:
92
http-server-demo/src/main/java/com/inmind/Server.java
Normal file
92
http-server-demo/src/main/java/com/inmind/Server.java
Normal file
@@ -0,0 +1,92 @@
|
||||
package com.inmind;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/*
|
||||
* 自定义web服务器
|
||||
*/
|
||||
public class Server {
|
||||
public static void main(String[] args) throws IOException {
|
||||
ServerSocket ss = new ServerSocket(8080); // 监听指定端口
|
||||
System.out.println("server is running...");
|
||||
|
||||
while (true){
|
||||
Socket sock = ss.accept();
|
||||
System.out.println("connected from " + sock.getRemoteSocketAddress());
|
||||
|
||||
//开启线程处理请求
|
||||
Thread t = new Handler(sock);
|
||||
t.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Handler extends Thread {
|
||||
Socket sock;
|
||||
|
||||
public Handler(Socket sock) {
|
||||
this.sock = sock;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
try (InputStream input = this.sock.getInputStream(); OutputStream output = this.sock.getOutputStream()) {
|
||||
handle(input, output);
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
this.sock.close();
|
||||
} catch (IOException ioe) {
|
||||
}
|
||||
System.out.println("client disconnected.");
|
||||
}
|
||||
}
|
||||
|
||||
private void handle(InputStream input, OutputStream output) throws IOException {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
|
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
|
||||
|
||||
// 读取HTTP请求:
|
||||
boolean requestOk = false;
|
||||
String first = reader.readLine();
|
||||
if (first.startsWith("GET / HTTP/1.")) {
|
||||
requestOk = true;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
String header = reader.readLine();
|
||||
if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
|
||||
break;
|
||||
}
|
||||
System.out.println(header);
|
||||
}
|
||||
System.out.println(requestOk ? "Response OK" : "Response Error");
|
||||
|
||||
if (!requestOk) {// 发送错误响应:
|
||||
writer.write("HTTP/1.0 404 Not Found\r\n");
|
||||
writer.write("Content-Length: 0\r\n");
|
||||
writer.write("\r\n");
|
||||
writer.flush();
|
||||
} else { // 发送成功响应:
|
||||
//读取html文件,转换为字符串
|
||||
InputStream is = Server.class.getClassLoader().getResourceAsStream("html/a.html");
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(is));
|
||||
StringBuilder data = new StringBuilder();
|
||||
String line = null;
|
||||
while ((line = br.readLine()) != null){
|
||||
data.append(line);
|
||||
}
|
||||
br.close();
|
||||
int length = data.toString().getBytes(StandardCharsets.UTF_8).length;
|
||||
|
||||
writer.write("HTTP/1.1 200 OK\r\n");
|
||||
writer.write("Connection: keep-alive\r\n");
|
||||
writer.write("Content-Type: text/html\r\n");
|
||||
writer.write("Content-Length: " + length + "\r\n");
|
||||
writer.write("\r\n"); // 空行标识Header和Body的分隔
|
||||
writer.write(data.toString());
|
||||
writer.flush();
|
||||
}
|
||||
}
|
||||
}
|
39
http-server-demo/src/main/resources/html/a.html
Normal file
39
http-server-demo/src/main/resources/html/a.html
Normal file
@@ -0,0 +1,39 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<table border="1" cellspacing="0" width="500">
|
||||
<tr>
|
||||
<th>序号</th>
|
||||
<th>品牌名称</th>
|
||||
<th>企业名称</th>
|
||||
|
||||
</tr>
|
||||
<tr align="center">
|
||||
<td>010</td>
|
||||
<td>三只松鼠</td>
|
||||
<td>三只松鼠</td>
|
||||
</tr>
|
||||
|
||||
<tr align="center">
|
||||
<td>009</td>
|
||||
<td>优衣库</td>
|
||||
<td>优衣库</td>
|
||||
</tr>
|
||||
|
||||
<tr align="center">
|
||||
<td>008</td>
|
||||
<td>小米</td>
|
||||
<td>小米科技有限公司</td>
|
||||
</tr>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user