自己实现HTTP服务器

序言

在做移动互联网开发的时候,HTTP协议是我们经常使用的协议。但是很多人都在用各种框架而不能连接HTTP协议的实质,其实HTTP协议就是建立在TCP协议上的一种应用层协议。而在java中要实现TCP通信,必不可少的就是Socket。包括我们经常使用的框架,比如OKHttp,内部使用的就是OKIO,而OKIO不过是对Socket通信的一种封装而已。下面我就用29行代码实现一个HTTP服务器,这个服务器只能接受一次访问,返回一条语句但是,已经能说明问题。

源码

HttpServer

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket client = serverSocket.accept();
        System.out.println("链接成功");
        StringBuffer sb = new StringBuffer();
        String outHtml = "欢迎来到我的世界";
        OutputStream ops = client.getOutputStream();
        sb.append("HTTP/1.1 200 OK\r\n");//HTTP头,200表示请求成功,/r/n是每行的分隔符必须有
        int length = outHtml.getBytes("utf-8").length;
        sb.append("Content-Length:" + length + "\r\n");//计算Content的长度,单位字节
        sb.append("\r\n");//空行,必不可少的分隔,用来将HTTP头和Body区分.
        sb.append(outHtml);//真正的内容,一般为网页的源代码
        byte[] data = sb.toString().getBytes("utf-8");
        ops.write(data);
        ops.flush();
        ops.close();
        client.close();
        serverSocket.close();
    }
}

抓包

自己实现HTTP服务器_第1张图片

运行效果

用浏览器访问 http://www.localhost:8888

自己实现HTTP服务器_第2张图片

总结

我认为大家有时间都可以自己尝试一下,通过自己实现HTTP协议,就能对服务器和客户端交互有更深刻的理解。这样在分析问题的时候思路就能更清晰,我只要知道浏览器通过TCP链接收到符合HTTP协议的内容就可以显示正确的内容,无论这个链接是通过什么设备发起的,无论是通过什么语言实现的。

你可能感兴趣的:(http学习)