前言

最近想到之前做的一个实时通信的小demo,发现对websocket不是很了解,现在决定重新好好学习一下websocket

websocket解决了什么问题,先给一个前提,http事务是一次性的,浏览器和服务端没办法做到全双工的通信过程。

而有些应用场景下又需要使用服务端和浏览器的全双工通信,比如股票信息,实时通信等。

这时候出现了几种解决方案,比如说轮询,还有长轮询机制,但是他们的缺点都是比较大的,感兴趣的可以自行去搜索一下

最终还是引入一个较为靠谱的协议,websocket

什么是websocket?

与其研究什么是websocket,不如研究为什么websocket能够实现全双工通信。

这个得从http协议说起,前面我们提到了长轮询和轮询两种机制都是基于http协议的req/res模型实现的,也就是脱离不了单工通信。

http协议是一种单工通信的协议,但是对于tcp协议来说他是一种tcp协议。

websocket只要依托tcp协议就能实现。

但是websocket作为应用层协议还是使用http协议用于一开始的握手

websocket建立流程

建立websocket的通道,需要先使用http协议发送一个握手报文。

握手报文也是有限制

1.必须使用get请求,使用http1.1版本以上 2.必须包含Upgrade头域,其内容必须包含websocket关键字。 3.3.必须包含Connection头域,其内容必须包含Upgrade指令。 必须包含Sec-WebSocket-Key头域,其内容是一个Base64编码的16位随机字符。

服务器收到这个握手报文之后需要回应,在回应之前需要做客户端发送的首部验证

同时还要对收到头部的字符进行一次编码回送回去,回送的状态码为101 ,101状态码表明回应协议升级,前面我们使用upgrade头域用于告诉服务器升级协议到websocket

使用websocket

建立流程简述完了之后时使用,websocket,websocket分为客户端和服务器,客户端也就是浏览器在HTML5中引入了Webscoket相关API

具体的API可以查看流程,而整个websocket使用依照一定流程

浏览器中的websocket也是基于事件触发来实现。

1.open事件,当连接打开的时触发 2.message,就收到数据时触发 3.close ,连接关闭时触发 4.error ,当连接中出现错误信息时触发

最后是用于将本地数据发送到服务器端send()方法,send方法可以穿插在各个地方,用于在不同需求下调用

在Node.js,服务端的创建可以使用socket.io这些库去使用,为什么需要使用socket.io这类库,这个原因还需要后面去发掘

相关文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: