试写http服务器-策底明白了b/s开发的本质

最近在尝试使用java的webservice
可是不知道是什么原因,总是本地确一些包。
补充了好几次包,还是有问题。
最后放弃加包的想法了。
于是我想自己写一个http服务器吧,了解 原理,在就没有困惑了。
于是做了如下的简单实践。
代码(java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class HTTPServer {
    public static void main(String[] args) {
        try {
            ServerSocket ss=new ServerSocket(8888);

            while(true){
                Socket socket=ss.accept();
                BufferedReader bd=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                
                /**
                 * 接受HTTP请求
                 */
                String requestHeader;
                int contentLength=0;
                while((requestHeader=bd.readLine())!=null&&!requestHeader.isEmpty()){
                    System.out.println(requestHeader);
                    /**
                     * 获得GET参数
                     */
                    if(requestHeader.startsWith("GET")){
                        int begin = requestHeader.indexOf("/?")+2;
                        int end = requestHeader.indexOf("HTTP/");
                        String condition=requestHeader.substring(begin, end);
                        System.out.println("GET参数是:"+condition);
                    }
                    /**
                     * 获得POST参数
                     * 1.获取请求内容长度
                     */
                    if(requestHeader.startsWith("Content-Length")){
                        int begin=requestHeader.indexOf("Content-Lengh:")+"Content-Length:".length();
                        String postParamterLength=requestHeader.substring(begin).trim();
                        contentLength=Integer.parseInt(postParamterLength);
                        System.out.println("POST参数长度是:"+Integer.parseInt(postParamterLength));
                    }
                }
                StringBuffer sb=new StringBuffer();
                if(contentLength>0){
                    for (int i = 0; i < contentLength; i++) {
                        sb.append((char)bd.read());
                    }
                    System.out.println("POST参数是:"+sb.toString());
                }
                //发送回执
                PrintWriter pw=new PrintWriter(socket.getOutputStream());
                
                pw.println("HTTP/1.1 200 OK");
                pw.println("Content-type:text/html");
                pw.println();
                pw.println("

访问成功!

"); pw.flush(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } } }

运行效果
试写http服务器-策底明白了b/s开发的本质_第1张图片
刚开始我有点困惑:这里用Socket,为什么不直接用http服务呢?
地址里直接输入http?/127.0.0.1为什么会在ServerSocket 反应呢?
这里的http到底有什么价值呢?
后来明白,http被协议解析的过程是,首先被浏览器解析http协议,然后向127.0.0.1这个地址发情报。
ServerSocket服务端,接到地址后,按照http协议进行处理,然后向该来源的地址发送相应的情报。
这里的处理过程其实和一个函数的调用过程是一样的。
浏览器,把一些数据安装http协议将一些数据发给服务端。这里的这些数据就相当于函数的入参,地址相当于函数名。
服务段根据,浏览器发过来的数据,进行相应的处理。然后返回给浏览器数据,这里返回的数据就相当于函数的返回值。
好了,原理明白了,自然是一件舒服的事情。
http协议的细节我并不清楚,甚至也不用太清楚,因为我对这个流程已经大概清楚了。
有种轻微的豁然开朗的感觉。
虽然细节还要很多需要挖掘,但是我至少以下一个形象的理解。
1.客户端给服务端发消息后,客户端要为服务端返回数据。
2.服务端和客户端定义了对数据理解的方式,比如get怎么理解。post怎么理解
3.服务给客户端发数据其实就是安装html组装数据,浏览器能够吧html语言解析成用户能看懂的ui(html也是http协议的一个回话基础)
有了这么个基本的理解,我明白了http变成和我们基本写一个函数的差别。关于这种开发,在我看来也就是安照协议传递数据的一种函数开发而已。
http协议是云服务的基础,试想一个云服务可以为人多客户端提供服务,他是怎么做到的呢?
就是客户端和服务端共同要遵循一定的通讯标准。
http就是这个标准最通用的承载者,当然还要其他的承载方式。
但http无疑是主题 ,云这东西,刚开始神乎其神的,把我都给吓唬住了。
任何东西,无论多复杂,多高大上,都离不开,程序开发的最基本过程,函数调用。
微指令=》函数=》丰富的软件世界。
无论何时,如你能把一个复杂的架构落实到函数调用上,我想你理解了这个架构了。
这个东西在你面前不那么神秘了。

你可能感兴趣的:(java,http服务器)