diff --git a/http-server-demo/pom.xml b/http-server-demo/pom.xml new file mode 100644 index 0000000..96bb233 --- /dev/null +++ b/http-server-demo/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + com.itheima + http-server-demo + 1.0-SNAPSHOT + + + 11 + 11 + + + diff --git a/http-server-demo/src/main/java/com/inmind/Server.java b/http-server-demo/src/main/java/com/inmind/Server.java new file mode 100644 index 0000000..b8239e0 --- /dev/null +++ b/http-server-demo/src/main/java/com/inmind/Server.java @@ -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(); + } + } +} diff --git a/http-server-demo/src/main/resources/html/a.html b/http-server-demo/src/main/resources/html/a.html new file mode 100644 index 0000000..1e01e3d --- /dev/null +++ b/http-server-demo/src/main/resources/html/a.html @@ -0,0 +1,39 @@ + + + + + Title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号品牌名称企业名称
010三只松鼠三只松鼠
009优衣库优衣库
008小米小米科技有限公司
+ + + + \ No newline at end of file