Websocket全双工协议与http协议哪个好用一些?并附上简单实际使用案例。
以下是我自己所了解的:
WebSocket协议可以实现双向通信,客户端和服务器都可以实时发送和接收数据,减轻了服务器的负担,但是建立一个长连接,又会增加服务器的负担,这与前面数据发送和接收有产生矛盾,同时长连接可能会被防火墙或代理服务器拦截。
HTTP协议无法实现实时通信,需要客户端不断地向服务器发送请求,服务器才能返回响应,这会增加网络延迟,并且会对服务器造成较大的负担。但是http协议比较简单易用,适用于各种编程语言和框架来实现。
疑问:
1、WebSocket协议与HTTP协议根据时间长短使用,哪种协议会对服务器造成很大的负担?
2、如果不考虑实时发送数据(只要发送出去,服务器接收到就行,不考虑中间网络延迟),只考虑实时接收到服务器所获取的消息,在这种情况下是否可以考虑使用WebSocket与服务器搭建连接,实时获取数据,使用http协议发送数据,两个搭配结合使用?如果使用这种方式会不会比单独使用时对服务器造成更大的负担?
3、如果根据问题2中所考虑的情况,建议使用哪种协议实现该功能?
在长连接时间内,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请求发送数据到服务器。这结合了两种协议的优势,是一种比较好的方案。