风忞 2023-05-31 16:14 采纳率: 50%
浏览 37
已结题

Websocket协议与http协议讨论

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

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

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

  • 写回答

2条回答 默认 最新

  • 断水流大撕兄 HarmonyOS创作领域新星创作者 2023-05-31 16:51
    关注
    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请求发送数据到服务器。这结合了两种协议的优势,是一种比较好的方案。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 已采纳回答 6月7日
  • 修改了问题 5月31日
  • 创建了问题 5月31日

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误