WebSocket的优缺点
1. WebSocket概念
1.1 WebSocket优点
- 低延迟
- 全双工
- 长期运行
- 双向实时通信
1.2 什么是心跳机制
为了保持WebSocket稳定的长连接,在建立连接后,服务器和客户端之间需要通过心跳包来保持连接状态,以防止连接因长时间没有数据传输而被切断.
心跳包是一直特殊的数据包,它不包含任何实际数据,仅用来维持连接状态.
1.3 WebSocket的限制
- 不提供加密功能.可以使用ssl或者设置白名单
- 不支持老版本的浏览器
- 需要对长连接进行维护
2. WebSocket简单代码实现
2.1 服务端
- 引入http和websocket模块
- 创建http服务器实例
- 通过http创建websocket服务器
- 当客户端连接到websocket时,触发connection事件
- 接收到客户端消息触发message事件,来处理收到的消息,并通过socket.send方法向客户端发送消息.
- 当客户端断开连接时,触发close事件.
const http = require('http');
const WebSocket = require('ws');const server = http.createServer();
const wss = new WebSocket.Server({ server });
wss.on('connection', (socket)=>{console.log('ws连接已经打开!');socket.on('message',(message)=>{console.log('收到消息'+message);socket.send('Hola');});socket.on('close',()=> {console.log('ws连接已关闭');});
});server.on('request',(request,response)=>{response.writeHead(200, {'Content-Type':'text/plain'});response.end('Hola');
});server.listen(8800,()=>{console.log('服务器已启动,服务端口为8800');
});
2.2 客户端
- 创建websocket实例,给它指定服务器地址
- 监听websocket事件
- 连接打开
- 收到消息
- 连接关闭
- 通过按钮事件发送消息到服务器
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>test-demo</title></head><body><button onclick="sendMsg()">发送消息</button></body><script>const socket=new WebSocket("ws://localhost:8800")socket.onopen=function(event) {console.log("连接建立")};socket.onmessage=function(event){console.log("收到消息:"+event.data)};socket.onclose=function(event){console.log("连接已关闭")};function sendMsg(){socket.send("hello!")};</script>
</html>
2.3 访问测试
在请求头中带上了Upgrade,服务器也响应成功
当客户端点击"发消息"后,在消息中可以看到客户端发送了Hello.服务器回复了Hola
在console中也能看到服务器返回内容