WebSocket

WebSocket 是一种在单个TCP连接上进行全双工通信的协议,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。WebSocket API 也被 W3C 定为标准。

在WebSocket API 中,通过 HTTP/1.1 协议的 101 状态码进行握手,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行数据传输。

 

      为了创建 WebSocket 连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为 “握手” (handshaking)。

      很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的时间间隔(如每1秒),由浏览器对服务器发出 HTTP 请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复给出请求。而且在Comet中,普遍采用的是长链接,也会消耗服务器资源。

     在这种情况下, HTML 定义了WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

 

WebSocket 特点

     较少的控制开销,在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。

     更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。

     保持连接状态。与 HTTP 不同的是,WebSocket 需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而 HTTP 请求可能需要在每个请求都携带状态信息(如身份认证等)。

     更好的二进制支持。WebSocket 定义了二进制帧,相对 HTTP,可以更轻松地处理二进制内容。

     可以支持扩展。WebSocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。

 

示例

WebSockets 它可以在用户浏览器和服务器之间打开交互式通信会话。使用此API,可以向服务器发送信息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。

// 创建WebSocket连接.
const socket = new WebSocket('ws://localhost:8080');
 
// 连接成功触发
socket.addEventListener('open', function (event) {
    socket.send('Hello Server!');
});
 
// 监听消息
socket.addEventListener('message', function (event) {
    console.log('Message from server ', event.data);
});

 

posted on 2022-02-28 15:46  zhishiyv  阅读(74)  评论(0编辑  收藏  举报

导航