首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Netty、MINA、Twisted一起学系列07:HTTP服务器

HTTP 协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP 协议进行数据传输。

HTTP 协议也是基于 TCP 协议,所以也有服务器和客户端。HTTP 客户端一般是浏览器,当然还有可能是其他东西。HTTP 服务器,也就是 Web 服务器,目前已经有很多成熟的产品,例如 Apache HTTP Server、Tomcat、Nginx、IIS等。

本文的内容不是讲解如何使用以上的 HTTP 服务器,而是要分别用 MINA、Netty、Twisted 实现一个简单的 HTTP 服务器。

1. HTTP协议

首先,要简单了解一下 HTTP 协议。HTTP 协议是请求/响应式的协议,客户端需要发送一个请求,服务器才会返回响应内容。例如在浏览器上输入一个网址按下 Enter,或者提交一个 Form 表单,浏览器就会发送一个请求到服务器,而打开的网页的内容,就是服务器返回的响应。

下面了解一下 HTTP 请求和响应包含的内容。

HTTP 请求有很多种 method,最常用的就是 GET 和 POST,每种 method 的请求之间会有细微的区别。下面分别分析一下 GET 和 POST 请求。

2. GET请求

下面是浏览器对http://localhost:8081/test?name=XXG&age=23的 GET 请求时发送给服务器的数据:

可以看出请求包含 request line 和 header 两部分。其中 request line 中包含 method(例如 GET、POST)、request uri 和 protocol version 三部分,三个部分之间以空格分开。request line 和每个 header 各占一行,以换行符 CRLF(即\r\n)分割。

3. POST请求

下面是浏览器对http://localhost:8081/test的POST请求时发送给服务器的数据,同样带上参数name=XXG&age=23:

可以看出,上面的请求包含三个部分:request line、header、message,比之前的 GET 请求多了一个 message body,其中 header 和 message body 之间用一个空行分割。POST 请求的参数不在 URL 中,而是在 message body 中,header 中多了一项 Content-Length 用于表示 message body 的字节数,这样服务器才能知道请求是否发送结束。这也就是 GET 请求和 POST 请求的主要区别。

4. HTTP响应

HTTP 响应和 HTTP 请求非常相似,HTTP 响应包含三个部分:status line、header、massage body。其中 status line 包含 protocol version、状态码(status code)、reason phrase 三部分。状态码用于描述 HTTP 响应的状态,例如 200 表示成功,404 表示资源未找到,500 表示服务器出错。

在上面的 HTTP 响应中,Header 中的 Content-Length 同样用于表示 message body 的字节数。Content-Type 表示 message body 的类型,通常浏览网页其类型是 HTML,当然还会有其他类型,比如图片、视频等。

学习了 HTTP 协议后,那么就可以分别通过 MINA、Netty、Twisted 实现针对请求的解码器和针对响应的编码器来实现一个 HTTP 服务器。实际上 HTTP 协议的细节还有很多,自己实现起来没那么容易。不过,MINA、Netty、Twisted都已经提供了针对 HTTP 协议的编码解码器和一些实用的 API。

5. MINA

MINA 中有一个 mina-http-2.0.7.jar 包,专门用于处理 HTTP 协议。在下面的代码中,需要将这个 jar 包引入到项目中。

HTTP 协议的请求解码器和响应编码器即 HttpServerCodec,它会将 HTTP 客户端请求转成 HttpRequest 对象,将 HttpResponse 对象编码成 HTTP 响应发送给客户端。需要注意的是,HttpRequest 和 HttpResponse 的实现类对象都没有包含 message body 部分,所以下面代码中 body 还通过原始的 IoBuffer 类型来构造。

6. Netty

Netty和MINA非常类似。唯一有区别的地方就是FullHttpResponse可以包含响应的message body。

7. Twisted

Twisted 的 HTTP 相比 MINA、Netty 来说功能最完善。Twisted 不但包含 HTTP 协议的编码器和解码器以及相关 API,还提供了一整套 Web 应用解决方案。想完整学习的话可以参考官方文档。

客户端:

前几篇文章都提供了一个 Java 客户端代码用于测试,由于本文是 HTTP 协议,Web 浏览器是一个天然的 HTTP 客户端,所以可以直接通过浏览器分别测试以上三个服务器。用浏览器打开:

http://localhost:8080/?name=叉叉哥

浏览器测试结果:

END

关注我

每天关注一点点

喜欢就点击“好看”吧

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190121G06XE700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券