之前的想实现五子棋时使用socket.io进行客户端之间消息的传递,但是遇到了一些问题,无法读取服务端打开文件的内置css文件和js脚本,因此改用webSocket来实现客户端之间的通信。
在学习WebSocket之前先讲一下其他两种客户端与服务端通信的机制。
Ajax轮询
ajax轮询模拟长连接就是每隔一段时间就向服务器发起ajax请求,查询服务器端是否有数据更新。
客户端:发起请求,询问。
服务器端:回应如果有就返回数据。
客户端:发起请求,询问。
服务器端:回应如果有就返回数据。
客户端:发起请求,询问。
服务器端:回应如果有就返回数据。
客户端:发起请求,询问。
服务器端:回应如果有就返回数据。
其缺点显而易见,每次都要建立HTTP连接,即使需要传输的数据非常少,所以这样很浪费带宽;同时,这个过程是被动性的,即服务器不能主动推送消息给客户端。
长轮询
原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直建立连接,没收到就不返回),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性(服务端不能主动联系客户端,只能由客户端发起)。
不管怎么样,上面这两种都是非常消耗资源的。ajax轮询是需要服务器有很快的处理速度和资源,长轮询则需要有很高的并发,也就是说同时保存多个客户端的能力。
这时候Websocket出现了。他解决了HTTP的这几个难题。首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端了。
WebSocket相对于Http是一个持久化的协议——不会断开连接——利用一次简单的握手建立起tcp协议。
实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端(不同于HTTP协议)。
原理:在实现websocket连线过程中,需要通过浏览器发出websocket连线请求,然后服务器发出回应,这个过程通常称为“握手” 。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。