由于HTTP协议的开销,导致它们不适用于低延迟应用。为了解决这些问题,WebSocket将网络套接字引入到客户端和服务端,浏览器和服务器之间可以通过套接字建立持久的连接,双方随时都可以互发数据给对方,而不是之前由客户端控制的一请一求模式。
HTTP协议介绍
HTTP协议的主要特点如下:
- 支持Client/Server模式
- 简单————客户向服务端请求服务时,只需指定服务URL,携带必须的请求参数或者消息体;
- 灵活————HTTP允许传输任意类型的数据对象,传输的内容类型由HTTP消息头中的Content-Type加以标记
- 无状态————HTTP协议是无状态协议,无状态是指协议对事务处理没有记忆能力。缺少状态意味着后续处理需要之前的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务端不需要先前信息时它的应答就较快,负载较轻。
HTTP协议的URL
HTTP URL(URL是一种特殊类型的URL,包含了某个资源的足够的信息)的格式如下。http://host[":"port][abs_path]
http:表示要通过HTTP协议来定位网络资源;
host:表示合法的Internet主机域名或者IP地址;
port:指定一个端口号,为空则使用默认80端口;
abs_path:指定请求资源的URI,如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这点工作浏览器会自动帮我们完成。
HTTP请求消息(HttpRequest)
HTTP请求由三部分组成,具体如下。
- HTTP请求行;
- HTTP请求头;
- HTTP请求正文。
请求行以一个方法符开头、以空格分开,后面跟着请求的URI和协议版本,格式为:Method Request-URI HTTP-version CRLF
其中Method表示请求方法,Request-URI是一个统一资源标识符,HTTP-Version表示请求的HTTP协议版本,CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CRLF字符)。
请求方法有多种,各方法作用如下:
- GET:请求获取Request-URI所标识的资源
- POST:在Request-URI所标识的资源后附加新的提交数据;
- HEAD:请求获取由Request-URL所标识的资源的响应消息报头;
- PUT:请求服务器存储一个资源,并用Request-URI作为其标识;
- DELETE:请求服务器删除Request-URI作为其标识;
- TRACE:请求服务器回送收到的请求消息,主要用于测试或者诊断;
- CONNECT:保留将来使用;
- OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求。
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源。如下图1所示。
图1 通过浏览器访问Netty HTTP服务端
通过服务端抓包,打印HTTP请求消息头,内容如下。
POST方法要求被请求服务端解释器附在请求后面的数据,常用于提交表单,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息,GET和POST的主要区别如下。
- 根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的;POST则表示可能改变服务器上资源的请求。
- GET提交,请求的数据会附在URL之后,就是把数据放置在请求行(request line)中,以“?”分隔URL和传输数据,多个参数用“&”连接;而POST提交会把数据放置在HTTP消息的包体中,数据不会再地址栏中显示出来。
- 传输数据的大小不同。特定浏览器和服务器对URL长度有限制,例如IE对URL的长度的限制是2038字节(2KB+35B),因此GET携带的参数的长度会受到浏览器的限制;而POST由于不是通过URL传值,理论上数据长度不会受限。
- 安全性。POST的安全性要比GET的安全性高。比如通过GET提交数据,用户名和密码将明文出现在URL上。因为登录页面有可能被浏览器缓存和其他人查看浏览器的历史记录,那么别人就可以拿到你的账号和密码了。除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。POST提交的内容由于在消息体中传输,因此不存在上述安全问题。
请求报头允许客户端向服务端传递请求的附加信息以及客户端自身的信息。常用的请求报头如表1所示。
表1 HTTP的部分请求消息头列表
HTTP响应消息(HttpResponse)
处理完HTTP客户端的请求之后,HTTP服务端返回响应消息给客户端,HTTP响应由三部分组成,分别是:状态行、消息报头、响应正文。
状态行的格式为:HTTP-Version Status-Code Reason-Phrase CRLF,其中HTTP-Version表示服务器HTTP协议版本,Status-Code表示服务器返回的响应状态代码。
状态代码由三位数组成,第一个数字定义了响应的类型,它有5种可能的取值。
- 1xx:指示消息。表示请求已接收,继续处理;
- 2xx:成功。表示请求已被成功接收、理解、接受
- 3xx:重定向。要完成请求必须进行更进一步的操作;
- 4xx:客户端错误。请求有语法错误或请求无法实现。
- 5xx:服务器端错误。服务端未能处理请求。
常见的状态代码、状态描述如表2所示。
表2 HTTP响应状态代码和描述信息
响应报头运行服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。常用的响应报头如表3所示。
表3 常用的响应报头
Netty HTTP服务端入门开发
我们通过文件服务器为例学习Netty的HTTP服务端入门开发。
HTTP服务端开发
代码清单1 HTTP文件服务器 业务逻辑处理HttpFileServerHandler
代码清单2 HTTP文件服务器 启动类HttpFileServer
Netty Http文件服务器例程运行结果
运行结果如图1所示.
图2 运行结果
在浏览器打开网址:http://127.0.0.1:8031/src/com/eric/netty/
看到浏览器上显示的是文件目录地址,如图2所示.
图3 文件目录地址