Websocket协议与http协议讨论

Websocket全双工协议与http协议哪个好用一些?并附上简单实际使用案例。

以下是我自己所了解的:
WebSocket协议可以实现双向通信,客户端和服务器都可以实时发送和接收数据,减轻了服务器的负担,但是建立一个长连接,又会增加服务器的负担,这与前面数据发送和接收有产生矛盾,同时长连接可能会被防火墙或代理服务器拦截。
HTTP协议无法实现实时通信,需要客户端不断地向服务器发送请求,服务器才能返回响应,这会增加网络延迟,并且会对服务器造成较大的负担。但是http协议比较简单易用,适用于各种编程语言和框架来实现。

疑问:
1、WebSocket协议与HTTP协议根据时间长短使用,哪种协议会对服务器造成很大的负担?
2、如果不考虑实时发送数据(只要发送出去,服务器接收到就行,不考虑中间网络延迟),只考虑实时接收到服务器所获取的消息,在这种情况下是否可以考虑使用WebSocket与服务器搭建连接,实时获取数据,使用http协议发送数据,两个搭配结合使用?如果使用这种方式会不会比单独使用时对服务器造成更大的负担?
3、如果根据问题2中所考虑的情况,建议使用哪种协议实现该功能?

  1. 在长连接时间内,WebSocket协议会给服务器带来较大负载,需要维持连接状态和发送心跳包。HTTP协议每次请求完成就断开,对服务器资源占用较小。

  2. 如果只考虑实时接收服务器消息,可以使用WebSocket建立长连接,然后通过HTTP发送数据。这种 hybrid 模式可以避免WebSocket发送数据带来的服务器负载,又可以实时接收数据。但是,同时使用两种协议,会给服务器带来一定的额外负载,比只使用一种协议的情况下稍高。

  3. 根据上述情况,我会推荐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请求发送数据到服务器。这结合了两种协议的优势,是一种比较好的方案。