|
@@ -0,0 +1,56 @@
|
|
|
|
+package com.sf.day31._03_mock_tomcat;
|
|
|
|
+
|
|
|
|
+import java.io.*;
|
|
|
|
+import java.net.ServerSocket;
|
|
|
|
+import java.net.Socket;
|
|
|
|
+
|
|
|
|
+public class Server {
|
|
|
|
+
|
|
|
|
+ public static void main(String[] args) throws IOException {
|
|
|
|
+// 1:创建一个服务端对象(ServerSocket)
|
|
|
|
+ ServerSocket serverSocket = new ServerSocket(10086);
|
|
|
|
+// 2:侦听客户端的连接,获取和客户端通信的Socket对象
|
|
|
|
+ while (true){
|
|
|
|
+ Socket socket = serverSocket.accept();
|
|
|
|
+// 3:从Socket获取输入流,接收服务器发送的数据
|
|
|
|
+ // 问题其实就是在读取请求头当中信息 , 读的时候现在while 循环当中出不来了,
|
|
|
|
+ // 问题就是读取请求头当中信息的时候他读取完以后其实是有一个空串 这个空转不等于-1 , 就认为没有读取完一直在while 中出不来
|
|
|
|
+ // 解决思路: 我们可以使用字符缓冲流 一行一行读取, 当读取最后一行时候是空串 我们直接停止循环就可以正常响应了
|
|
|
|
+ InputStream inputStream = socket.getInputStream();
|
|
|
|
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
|
|
|
|
+
|
|
|
|
+ byte[] buffer = new byte[1024];
|
|
|
|
+ String str = "";
|
|
|
|
+ while ((str = bufferedReader.readLine())!=null){
|
|
|
|
+ if(str.equals("")){
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ System.out.println(str);
|
|
|
|
+ }
|
|
|
|
+// 4:调用Socket对象对象shutdownInput方法通知客户端数据接收完毕
|
|
|
|
+// 5:从Socket中拿到输出流往客户端发送数据
|
|
|
|
+ // 问题:我们使用outputsteam 去给浏览器去响应数据发现数据没有在浏览器中展示出来
|
|
|
|
+ // 原因: 是因为浏览器对于响应数据和格式是有要求的,我们必须要按照浏览器的数据格式进行响应才可以
|
|
|
|
+ // 浏览器在响应的时候必要要求服务器返回 HTTP/1.1 200 OK 协议
|
|
|
|
+ // Content-Type: text/html; charset=utf-8 响应数据格式 如果你没有这个响应头,
|
|
|
|
+ // 浏览器的渲染引擎就无法渲染你返回的代码, 很明显我们现在没有给他返回状态码, 也没有给他返回数据格式
|
|
|
|
+ // 解决: 想办法给他响应指定的数据格式
|
|
|
|
+
|
|
|
|
+ OutputStream outputStream = socket.getOutputStream();
|
|
|
|
+ // 想要响应的数据是一行一行的
|
|
|
|
+ PrintStream printStream = new PrintStream(outputStream);
|
|
|
|
+ // 这个方法可以让我们在输出的时候自动换行
|
|
|
|
+ printStream.println("HTTP/1.1 200 OK"); // 响应状态码和协议
|
|
|
|
+ printStream.println("Content-Type: text/html; charset=utf-8"); //响应数据格式,浏览器根据响应数据格式进行渲染
|
|
|
|
+ printStream.println(""); // 在我们响应的内容和响应头信息中间要留一行
|
|
|
|
+ printStream.println(("<html><head><title>123</title></head><body>123123</body></html>"));
|
|
|
|
+ printStream.flush(); // 开始渲染我们返回html代码
|
|
|
|
+// 3 调用Socket对象shutdownOutput 方法通知服务端数据发送完毕
|
|
|
|
+ socket.shutdownOutput();
|
|
|
|
+// 6:调用Socket对象对象shutdownOutput方法通知客户端数据发送完毕
|
|
|
|
+// 7:关闭Socket对象
|
|
|
|
+ socket.close();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|