【Web开发须知】WebSocket 开发指南

WebSocket由来已久,常用于"服务器推"场景。最近开始学习WebSocket(从tomcatexamples开始),本文的主要目的是做学习笔记,同时记录一份开发指南。

本文示例代码见:https://github.com/hanyong/exercise/tree/websocket

HTTP协议简述

我们先来看看HTTP。

一次HTTP请求过程如下:

客户端服务器

1.客户端建立到服务器的TCP连接

2.客户端发送请求

3.客户端等待响应

4.服务器收到请求

5.服务器发送响应

6.客户端收到响应

7.请求结束

TCP连接是支持双向同时读写的全双工协议,但是我们看传统的HTTP协议有几个问题:

请求过程是串行的,客户端与服务器互相等待.

请求是单向的,总是必须客户端先发起请求.

也就是说,传统的HTTP1.0/1.1协议没有充分利用TCP连接的能力.

HTTP协议是无状态的,两个请求是从同一个TCP连接发过来,还是从不同的TCP连接发过来,对服务器来说应该是等价的.

HTTP协议这样的设计主要是简化了编程模型,想一想传统的CGI脚本,一个脚本只要能够接受输入,产生输出,就可以提供web服务。HTTP协议缺少ISO7层网络模型中的会话层,动态web应用使用cookie来保存会话信息。HTTP/1.1默认开启长连接来优化性能,但HTTP连接和请求依然是无状态的。对传统提供静态内容服务,或返回信息相对确定的web应用而言,这样的设计并没有问题,或者说虽然有一些不足,但尚能忍受。无状态的设计也简化了HTTP测试,日志回放也成为重要的HTTP服务测试手段之一。

websocket协议简述

直到"服务器推"场景的出现。服务器端信息随时可能变化,我们希望将变化后最新的信息立即通知给客户端。传统的解决方案是客户端不断轮询服务器,如每秒1次。这种轮询将产生许多额外的代价,包括移动端流量收费,并且编程模型也相对复杂。因此,是时候开放TCP双向通信的能力了。我们可以重新写一个TCP服务器,使用新的协议来通信。但也许是为了复用HTTP的80端口,依附现有HTTP生态圈,让web应用平滑升级,websocket基于HTTP协议设计,顾名思义就是基于webHTTP协议,释放原生TCPsocket的能力。所以websocket一开始还是按HTTP协议通信,随后才转换成websocket。

一个websocket连接的建立过程如下:

客户端服务器

1.客户端建立到服务器的TCP连接

2.客户端请求将当前TCP连接用作websocket

3.服务器收到请求,同意并确认将此TCP连接用作websocket

4.客户端收到确认,HTTP协议通信结束

5.双方使用websocket协议自由双向通信

websocket可基于HTTP建立,即ws协议,也可基于HTTPS建立,即wss协议,果然是复用了HTTP的基础设施。

HTTP与websocket客户端

HTTP客户端发送完请求后才会监听响应,收到一次响应后即结束。常见的HTTP客户端有:

curl,如curllocalhost:8080/http.

浏览器js客户端,如angularjs的$http服务.

$http.get("/http").then(function(resp){

vm.msg=resp.data;

});

直接在浏览器输入URL.

回顾"服务器推"场景,websocket与HTTP协议最大的不同在于服务器不必等待请求,也不再使用"请求","响应"这样的术语,而改称为消息,双方都可以随时互发消息。HTTP客户端不会一直监听消息,所以显然不能作为websocket客户端(且不说协议是否兼容)。要使用websocket,客户端和服务器都需要改造。常见的websocket客户端有:

浏览器js客户端。感谢浏览器厂商,现在的主流浏览器都支持websocket。

阅读全文直接点击:http://click.aliyun.com/m/9971/

相关推荐