在长连接时间内,WebSocket协议会给服务器带来较大负载,需要维持连接状态和发送心跳包。HTTP协议每次请求完成就断开,对服务器资源占用较小。
如果只考虑实时接收服务器消息,可以使用WebSocket建立长连接,然后通过HTTP发送数据。这种 hybrid 模式可以避免WebSocket发送数据带来的服务器负载,又可以实时接收数据。但是,同时使用两种协议,会给服务器带来一定的额外负载,比只使用一种协议的情况下稍高。
根据上述情况,我会推荐hybrid模式 - 使用WebSocket连接实时接收数据,使用HTTP发送数据。这可以兼顾实时性与服务器负载,是一种比较平衡的方案。
例如NodeJs可以这样实现WebSocket连接接收实时消息与HTTP发送数据的hybrid模式:
// WebSocket连接,接收实时消息
const ws = new WebSocket('ws://server_address/websocket');
ws.onopen = () => {
console.log('WebSocket连接已打开!');
}
ws.onmessage = msg => {
console.log(`接收消息:${msg.data}`);
}
// HTTP请求,发送数据
const options = {
method: 'POST',
uri: 'http://server_address/send_data',
body: {message: 'Hello'},
json: true
};
request(options, (err, response, body) => {
console.log('数据发送成功!');
});
服务器端使用WebSocket和Express框架:
// WebSocket服务
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });
wss.on('connection', ws => {
ws.on('message', msg => {
// 处理客户端消息
});
setInterval(() => {
ws.send(getNewData()); // 实时发送数据到客户端
}, 1000);
});
// Express API
const express = require('express');
const app = express();
app.post('/send_data', (req, res) => {
const data = req.body;
handleData(data); // 处理客户端发来的数据
res.send('success');
});
app.listen(8080);
这样Node.js后端同时提供WebSocket服务实时发送数据,和Express API接收客户端HTTP请求,实现hybrid模式。
客户端通过WebSocket连接可以实时接收数据,通过HTTP请求发送数据到服务器。这结合了两种协议的优势,是一种比较好的方案。