什么是websocket
websocket是一个持久化的协议。
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
这是一段websocket请求。
Upgrade: websocket
Connection: Upgrade
这里指明来发起的是websocket协议
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
这是一个base64 encode的值,是浏览器随机生成的,服务器端会根据该字段计算出Sec-WebSocket-Accept返回来证明握手成功
Sec-WebSocket-Protocol: chat, superchat
这是用户定义的字符串用来区分不同的服务
Sec-WebSocket-Version: 13
告诉服务器所使用的协议版本
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
这是一段websocket响应。表示已经接收到请求成功建立websocket。
Sec-WebSocket-Accept
即经过服务器确认加密后的Sec-WebSocket-Key
Sec-WebSocket-Protocol
表示最终使用的协议
webscket的作用
在不使用websocket情况下实时获取最新的数据有两种方式。
1.短连接轮询,每隔几秒发送一次请求获取新的消息。
2.长连接轮询,在客户端发起请求后,如果没有新的消息服务器端就把请求挂起直到有新的消息再发送或直到请求超时,然后客户端再次发送请求。
这两种方式服务端都不能主动联系客户端,只能是客户端发起请求。
而且这两种方式都很耗费资源,短连接需要服务器有很快的处理速度和资源,长连接则需要有高并发。
而websocket可以使服务端主动推送消息给客户端,例如当使用postman调用删除信息的接口,服务端在删除信息后可以直接告诉订阅的客户端信息被删了,客户端就可以即时响应变化。
//创建socket服务端,将io传入消息服务器
const io = require('socket.io')(server).of(config.root ? config.root + '/socket.io' : '/socket.io');
notificationServer(io);
//监听socket的连接断开事件,记录下socketid,再将io传入到各细分的消息模块供使用
function notificationServer(io) {
io.on('connection', function (socket) {
LogFile.info('connection ... ...');
connCount++;
sockets[socket.id] = socket;
socket.on('disconnect', function () {
LogFile.info('disconnection ... ...');
clearSubscriber(socket.id);
delete sockets[socket.id];
connCount--;
});
});
notifications.forEach(notification => {
notification(io);
});
}
网友评论