Skip to content

WebSocket

特点

  1. 长时连接实现与服务器全双工、双向的通信
  2. HTTP 协议有着良好的兼容
  3. 数据格式比较轻量,性能开销小,通信高效
  4. 可以发送文本,也可以发送二进制数据
  5. 没有同源限制,客户端可以与任意服务器通信。
  6. 协议标识符是ws(如果加密,则为wss

使用

  1. 使用 WebSocket 构造函数创建一个 WebSocket对象,并传入一个连接的绝对 URL
  2. 监听相应事件(只支持 on 形式),并作出相应操作
js
const ws = new WebSocket("wss://echo.websocket.org");

ws.onopen = () => { // 打开并发送信息
  ws.send("Hello WebSockets!"); // 可传字符串、Blob、ArrayBuffer
};

ws.onmessage = e => { // 接受信息
  console.log( "Received Message: " + e.data);
  ws.close();
};

ws.onclose = e => { // 关闭
  /**
  	1. e.wasClean: 布尔值,表示是否干净地关闭
  	2. e.code:来自服务器的数值状态码
  	3. e.reason:字符串,包含服务器发来的消息
  **/
  console.log("Connection closed.");
}

除了 WebCocket ,还有什么可以做到聊天功能?

一、Ajax 轮询

采用Ajax定时向服务端发送请求检查有无消息更新。网页定时向服务器发送请求,若服务器有消息推送,则返回消息,否则返回空消息

这种轮询方式需要发送大量无效请求,大大消耗了服务器资源,且推送消息的实时性较低

二、Ajax 长轮询

Ajax长轮询对前面的Ajax轮询方式做了改进,服务端收到请求后,不再立即返回,而是等待有消息推送时返回。网页收到服务端返回的消息后,立即发起一个新的请求,等待下一个推送消息。

三、Server-Send Event
  1. 单向通道,只允许服务器向浏览器发送信息
  2. 使用 http 协议
js
var source = new EventSource('http://localhost:8080');    
source.addEventListener('message', function(e) { console.log(e.data); }, false);