我认为毫不夸张地说,对于已经决定认真从事现代Web开发的任何领域的任何人,必须了解和理解
HTTP协议的本质。 我的个人经验表明,理解并不会马上到来。 我很ham愧地说,有时候GET和POST这两个词对我来说就像魔术一样,我什至都不怀疑PUT,PATCH和DELETE的存在。
几个月前,除了开发本身以外,我还开始教学,并且出现了一个问题,即如何更容易,更清晰地向未来的Java开发人员介绍HTTP协议的本质。 经过几天的大惊小怪和一系列不成功的演示文稿,这个想法浮出水面,为什么不用Java写一个简单的HTTP服务器,因为它不能解释协议的本质以及最简单但可行的实现。
事实证明,这一点都不困难。 以下是足以与任何浏览器正确交互的代码! 我们需要的只是一个ServerSocket和一些标准的I / O。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class HttpServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println("Server started!"); while (true) {
尝试运行此代码。 应当注意,为其创建ServerSocket的端口必须是空闲的。 如果指定的端口繁忙,则必须释放它或使用另一个空闲端口。
运行此代码后,转到浏览器窗口,然后在地址栏中输入
http://localhost:8080/
。 如果一切顺利,那么在浏览器窗口中,我们将看到文本“大家好”,而在服务器日志中,则类似于以下内容:
Server started! Client connected! GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,he;q=0.6,de;q=0.5,cs;q=0.4 Cookie: _ga=GA1.1.1849608036.1549463927; portainer.pagination_containers=100; _gid=GA1.1.80775985.1550669456; If-Modified-Since: Sat, 05 Jan 2019 12:10:16 GMT Client disconnected!
每次我们在浏览器的地址栏中输入内容并按Enter键时,除了发送以GET开头并以换行符结尾的文本外,什么都没有发生。 单词GET之后,服务器上所请求文档的路径后跟一个空格。 尝试在浏览器中输入
http://localhost:8080/something
,然后查看日志中的请求文本如何更改。
在查询行中,从第二行开始是所谓的 标头,通过它可以将有关客户端设置的信息传输到服务器。 每个标题行的格式为
[ ] : []; []; ... []
[ ] : []; []; ... []
[ ] : []; []; ... []
。
服务器完全读取了请求文本后,我们将最简单的响应发送给他,该响应的结构非常简单,类似于请求的结构。 第一行包含HTTP协议版本和
200 OK代码,它们将告诉浏览器请求已成功处理(每个人都更了解404代码,不是吗?)。 这之后是一个
Content-Type标题,在该标题中发送有关所传输文档的格式(文本/ html)及其编码(charset = utf-8)的信息。 标头后是换行符(HTTP协议的强制要求)和将在浏览器中显示的实际文本。
仅此而已! 当然,对于HTTP协议和开发Web服务器的原理,这还远远不需要了解,但是我不想使这个示例复杂化,因为 他的主要任务是演示通过HTTP协议进行的最简单的通信。 在下一篇文章中,我将尝试通过HTTP协议的实现来研究HTTP协议。
UPD
Paul Deck,Budi Kurniawan ,
Budi Kurniawan撰写的第1章“
简单Web服务器 ”中的Tomcat的工作原理:开发自己的Java Servlet容器的指南中提供了这种服务器的更高级示例。
UPD1。 基于本文的网络研讨会
www.youtube.com/watch?v=RBUFdFKg_rI