zoukankan      html  css  js  c++  java
  • 72 手写HTTP服务器

    HTTP服务器

    http协议的底层是tcp/ip协议,浏览器与服务器的交互就是tcp的通信过程。所以我们可以使用先前学的tcp通讯知识点搭建一个简单的服务器。

    思路

    • 使用ServerSocket创建一个服务器端(指定端口为8888),阻塞式接受tcp请求(accept()方法)
    • 从浏览器访问:http://localhost:8888 就能与服务器端建立连接
    • 建立了连接相当于tcp连接建立完成,可以使用Socket client = x.accept() 创建浏览器端的socket
    • 创建输入流获取浏览器传入的信息(请求信息)
    • 创建输出流返回响应信息,响应信息格式是固定的,一旦写错,浏览器无法接收响应信息
    • 归纳如下:
      public static void main(String[] args) {
      	//创建服务器
      	//阻塞式接受
      	//创建输入流
      	//读取请求
      	//创建输出流
      	//返回响应
      		//响应头
      		//响应内容
      }
      

        

    代码

    必读注意事项,响应头必须不能写错:

    • HTTP/1.1 200 OK 缺少此行无法响应,200是状态码,表示响应成功
    • Date:日期
    • Server:服务器名称等信息
    • Content-type:text/html;charset=utf-8  //不写charset=utf-8会导致浏览器解读乱码
    • Content-length:内容长度,注意就是这一行content-length这两个单词绝对不能写错,一旦写错,无法返回响应
    • 这里有回车换行符。缺少此回车换行,同样不能返回响应。
    • 响应数据中不包含响应内容也无法响应
    package _20191225_review;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Date;
    
    /**
     * 昨天写的Server真的是云里雾里,今天再来写一次,先面向流程的吧
     * @author TEDU
     *
     */
    public class Server {
    	public static void main(String[] args) throws IOException {
    		//创建服务器
    		ServerSocket server = new ServerSocket(8888);
    		//阻塞式接受
    		Socket client = server.accept();
    		//创建输入流
    		BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
    		//读取请求
    		char[] requestInfo = new char[1024*10];
    		int len = br.read(requestInfo);
    		System.out.println(new String(requestInfo));
    		//创建输出流
    		OutputStream is = client.getOutputStream();
    		//返回响应
    			//响应内容
    		StringBuilder content = new StringBuilder();
    		content.append("<html>");
    		content.append("<head>");
    		content.append("<title>");
    		content.append("响应成功");
    		content.append("</title>");
    		content.append("</head>");
    		content.append("<body>");
    		content.append("响应成功了熊");
    		content.append("</body>");
    		content.append("</html>");
    			//响应头:用StringBuilder来存储
    		StringBuilder responseInfo = new StringBuilder();
    			/*
    			 响应行:HTTP/1.1 200 OK
    			Date:日期
    			Server:服务器名称等信息
    			Content-type:text/html
    			Content-length:
    			 */
    		String CRLF = "
    ";
    		int size = content.toString().getBytes().length;
    		responseInfo.append("HTTP/1.1 200 OK").append(CRLF);//不添加响应行无法响应!!!!!!!!!!!!!!!!!!
    		responseInfo.append("Date:").append(new Date()).append(CRLF);
    		responseInfo.append("Server:xiaohei Server/1.0.0").append(CRLF);
    		responseInfo.append("Content-type:text/html").append(CRLF);
    		responseInfo.append("Content-length:").append(size).append(CRLF);//这一行写错无法响应!!!!!!!!!!!!!!!!
    		responseInfo.append(CRLF);//不能缺少的回车换行符!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    			//将content添加进响应消息中
    		responseInfo.append(content);//不添加content也无法响应!!!!!!!!!!!!!!!!!!!!!!!!
    		is.write(responseInfo.toString().getBytes());
    		is.flush();
    	}
    }
    
    
    

      

     
  • 相关阅读:
    网络通信协议八之(传输层)TCP协议详解
    MongoDB数据库连接失败
    Flask web开发之路十四
    Flask web开发之路十三
    Flask web开发之路十二
    Flask web开发之路十一
    Flask web开发之路十
    NEERC 1999 Advertisement /// oj22646
    upper_bound() lower_bound() 用法
    palindrome 回文 /// Manacher算法
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12095065.html
Copyright © 2011-2022 走看看