序言
在做移动互联网开发的时候,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 = "<html><b1>欢迎来到我的世界</b1></html>";
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://www.localhost:8888
总结
我认为大家有时间都可以自己尝试一下,通过自己实现HTTP协议,就能对服务器和客户端交互有更深刻的理解。这样在分析问题的时候思路就能更清晰,我只要知道浏览器通过TCP链接收到符合HTTP协议的内容就可以显示正确的内容,无论这个链接是通过什么设备发起的,无论是通过什么语言实现的。