首页 > 其他分享 >WebSocket魔法师:打造实时应用的无限可能

WebSocket魔法师:打造实时应用的无限可能

时间:2023-11-09 17:23:05浏览次数:39  
标签:websocket log 实时 console 魔法师 ws WebSocket 连接 客户端

1、背景

在开发一些前端页面的时候,总是能接收到这样的需求:如何保持页面并实现自动更新数据呢?以往的常规做法,是前端使用定时轮询后端接口,获取响应后重新渲染前端页面,这种做法虽然能达到类似的效果,但是依然有很多缺点,缺点就不在这里说了,感兴趣的小伙伴可以自行查阅一下。现在让我们回忆一下,我们有没有想过,是否有一种技术,服务器可以主动将数据推送给客户端进行渲染,而不再是客户端向服务器发出请求等待返回结果呢?接下来,让我们一起了解weboskcet。

2、什么是websocket

websocket是HTML5规范的一个部分,它借鉴了socket的思想,实现了浏览器与服务器全双工通信,达到了即时通信的效果。websocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输过程,避免服务器频繁打开多个HTTP连接,从而能更好的节省服务器资源和带宽,提高工作效率与资源利用率

3、工作原理

websocket的通信规范,首先浏览器通过HTTP协议发出websocket的连线请求,服务器进行响应,这个过程称为握手,握手完成后,客户端和服务器之间建立一个类似TCP的连接,使用websocket协议,从而实现它们之间的通信。

4、与HTTP的关系

相同点:

1、都是基于TCP协议,且都是可靠性传输协议;

2、都是应用层协议;

3、websocket支持两种资源标志符ws(默认80端口)与wss(默认443端口),类似HTTP和HTTPS;

不同点:

1、websocket是双向通信协议,HTTP是单向的;

2、websocket是需要浏览器和服务器握手进行建立连接的,HTTP是浏览器发起向服务器的连接,服务器预先并不知道这个连接。

联系点:

websocket在建立握手时,数据是通过HTTP传输的,建立之后的数据传输将不再需要HTTP协议,而是websocket协议;

5、websocket创建与常用的属性方法

5.1 websocket属性

属性 描述
readyState 只读属性 readyState 表示连接状态,可以是以下值:0 :表示连接尚未建立。1 :表示连接已建立,可以进行通信。2 :表示连接正在进行关闭。3 :表示连接已经关闭或者连接不能打开。
bufferedAmount 只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。
CONNECTING 值为0,表示正在连接
OPEN 值为1,表示连接已建立,可以进行通信
CLOSING 值为2,表示连接正在关闭
CLOSED 值为3,表示连接已经关闭或者连接不能打开
// 创建websocket
var ws = new WebSocket("ws://www.example.com");
  if(ws.readyState == ws.CONNECTING){
    console.log('连接正在打开');
  }

  ws.onopen = function () {
    ws.send(consumerId);
    if(ws.readyState == ws.CONNECTING){
      console.log('连接正在打开1');
    }
    if(ws.readyState == ws.OPEN){
      console.log('连接已打开');
    }
    console.log('已经建立连接');
    // 关闭连接
    // ws.close()
  };


  // 连接关闭时触发
  ws.onclose = function () {
    if(ws.readyState == ws.CLOSED){
      console.log('连接已关闭')
    }
  };

  // 连接错误
  ws.onerror = function () {
    console.log('连接错误');
  };



5.2 weboscket事件

事件 处理程序 描述
open onopen 连接建立时触发
message onmessage 接收消息时触发
error onerror 发生错误时触发
close onclose 关闭连接时触发

5.3 客户端的简单示例

// 创建websocket
var ws = new WebSocket("ws://www.example.com");

// 连接成功时触发
ws.onopen = function(e) {
    console.log("Connectiong open ...");
    // 发送消息
    ws.send("Hello WebSocket");
};

// 接收消息时触发
ws.onmessage = function(e) {
    console.log("Received Message: " + e.data);
    ws.close();
};

// 关闭连接时触发
ws.onclose = function(e) {
    console.log("Connection closed");
};

// 出现错误时触发
ws.onerror = function(e) {
    console.log("error");
};



5.4 服务端的简单示例

# 创建websocket服务端
from tornado.websocket import WebSocketHandler

class wsHandler(WebSocketHandler):
    # 保存连接的用户,用于后续推送消息
    connect_users = set()
    
    # 已与客户端建立连接
    def open(self):
        print("开启WebSocket opened")
        self.connect_users.add(self)

    # 关闭客户端连接
    def on_close(self):
        self.connect_users.remove(self)
    
    # 接收到消息
    def on_message(self, message): 
        self.write_message("接收到客户端的消息:{}".format(message))

    # 所有用户发送消息
    @classmethod
    def send_demand_updates(cls, message):
        # 使用@classmethod可以使类方法在调用的时候不用进行实例化
        # 给所有用户推送消息(此处可以根据需要,修改为给指定用户进行推送消息)
        for user in cls.connect_users:
            user.write_message(message)

    # 允许WebSocket的跨域请求
    def check_origin(self, origin):
        return True

if __name__ == "__main__":
    # 调用
    wsHandler。send_demand_updates("服务端发送给客户端的消息")



注意:示例中使用python语言,需依托tornado框架搭建后端web服务端,文章中不再说明如何搭建服务端,感兴趣的小伙伴可自行尝试。tornado内置websocket模块,能更简单的支持使用websocket。

6、总结

websocket提供了一种低延迟、高性能的双向数据通信,不同与web开发的请求、处理、等待响应模式,它是客户端、服务端因为同一个连接直接就可以数据互传的模式,特别适合实时数据交互的应用进行开发。

实用点:

1、websocket连接建立后,后续的数据传输都将以帧序列的形式传输;

2、在客户端断开websocket连接或服务端中断连接前,不需要客户端和服务端重新发起连接请求;

3、在海量并发、客户端与服务器交互负载流量大的情况下,节省网络带宽资源的消耗,且客户端发送与接收消息,都是在同一个持久连接上进行,实现了“真长连接”,真正的实现即时通信。

作者:京东物流 骆铜磊

来源:京东云开发者社区 自猿其说Tech 转载请注明来源

标签:websocket,log,实时,console,魔法师,ws,WebSocket,连接,客户端
From: https://www.cnblogs.com/Jcloud/p/17819093.html

相关文章

  • websocket的消息丢失处理,以及前端监听心跳处理方案
    消息丢失处理方案:1、后台通过websocket传输给前端消息,并且后台生成校验此消息的定时任务,设置每5秒重发2、前端接收到消息后将消息通过websocket传输给后台3、后台如接收到前端的消息则删除对应的发送消息定时任务,如未收到消息则继续发送,设置最多发送5次(超过5次默认认为此条消......
  • Hadoop细粒度近实时慢节点告警实践
    1.背景在https://blog.51cto.com/u_15327484/8260931文章中,介绍了通过抓取Yarnweb页面的方式获取task级别的进度,并且将task进度通过纵向的历史进度进行预测对比检查作业进度是否符合预期。对于task级别的进度,不仅可以用作纵向对比,还可以进行横向对比。当多次发生某个节点上执行......
  • Hadoop作业实时智能监控项目实践
    1.背景对于Hadoop集群监控,有基于Linux的硬件告警,比如磁盘,内存,网络带宽告警;有基于组件的告警,例如OOM报警、RPC告警。这些告警能反应个体机器的运行状况,不能反映整个集群的运行状况;同时,这些告警都是在已知的故障指标,但是对于未知的指标,可能已经发生并且对系统产生较大影响,由于没有......
  • Spring Boot + WebSocket 实时监控,实战来了!
    写在前面此异常非彼异常,标题所说的异常是业务上的异常。最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理。因为需要服务端主动向客户端发送消息,所以很容易的就想到了用WebSocket来实现这一功......
  • 一个可以自动把微信的聊天收到的二维码图片实时提取出来并分类的软件
    10-1如果你有需要实时地、自动地把微信各个群收到的二维码图片提取出来的需求,那本文章适合你,本文章的主要内容是教你如何实现自动提取微信收到的二维码图片,助你快速扫码,永远比别人领先一步。 首先需要准备好的材料:1,一台电脑,个工具是电脑软件,手机不行2,你的微信,支持微信多开,多个也可......
  • js实现webSocket客户端
    var ws= new WebSocket("ws://localhost:8080/msg");//readyState属性返回实例对象的当前状态,共有四种。//CONNECTING:值为0,表示正在连接。//OPEN:值为1,表示连接成功,可以通信了。//CLOSING:值为2,表示连接正在关闭。//CLOSED:值为3,表示连接已经关闭,或者打开连接失败//例如:if......
  • Eolink Apikit 如何对所有 API 异常请求实时监控 ?
    API监控适合业务在互联网上,并且用户来自多个不同的地区,且对API的要求较高的场合,用于解决以下的问题:发现由于网络中断或者是API响应异常等导致的服务不可用;及时对异常的API进行告警;记录监控的日志,方便排查。EolinkApikit除了提供API的管理和自动化测试等功能,还提供API......
  • Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座
    摘要:本文整理自阿里云开源大数据表存储团队负责人,阿里巴巴高级技术专家李劲松(之信),在StreamingLakehouseMeetup的分享。内容主要分为四个部分:流计算邂逅数据湖PaimonCDC实时入湖Paimon不止CDC入湖总结与生态一、流计算邂逅数据湖流计算1.0实时预处理流计算1.0架构截止......
  • 实时目标检测与跟踪:机器视觉的挑战与机遇
    实时目标检测与跟踪是机器视觉领域的一个重要研究方向,它涉及到在视频或图像序列中准确地定位和跟踪多个目标对象。这个任务具有很高的挑战性,同时也带来了许多机遇。挑战:1.复杂背景:目标检测与跟踪需要在复杂的背景中准确地识别和定位目标对象。这需要算法能够有效地处理遮挡、光......
  • 选择实时操作系统(RTOS)的要点详解
    选择实时操作系统(RTOS)的要点详解dy9h127cequf•来源:CSDN-refine19• 2023-05-3009:45 • 561次阅读 • 0个评论对许多嵌入式项目来说,系统设计师都倾向于选择实时操作系统(RTOS)。但RTOS总是必要的吗?答案是取决于具体的应用,因此了解我们要达到什么目标是决定RTOS是必......