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

这篇具有很好参考价值的文章主要介绍了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 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-746059.html

到了这里,关于WebSocket魔法师:打造实时应用的无限可能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实现实时互动:用Spring Boot原生WebSocket打造你的专属聊天室

    😊 @ 作者: 一恍过去 💖 @ 主页: https://blog.csdn.net/zhuocailing3390 🎊 @ 社区: Java技术栈交流 🎉 @ 主题: 实现实时互动:用Spring Boot原生WebSocket打造你的专属聊天室 ⏱️ @ 创作时间: 2023年08月04日 WebSocket 实现聊天室的原理包括建立 WebSocket 连接的握手过程、保持连接状态以

    2024年02月10日
    浏览(41)
  • 实时包裹信息同步:WebSocket 在 Mendix 中的应用

    在现代物流中,能够实时跟踪包裹信息,尤其是包裹重量,是非常重要的。在这种场景中,我们可以使用称重设备获取包裹的信息,然后实时将这些信息同步给 Mendix 开发的 App,并在 App 的页面上实时显示包裹信息。这种实时的、无缝的信息同步提供了一个更好的用户体验,

    2024年02月13日
    浏览(28)
  • 鸿蒙应用开发-录音并使用WebSocket实现实时语音识别

    功能介绍: 录音并实时获取RAW的音频格式数据,利用WebSocket上传数据到服务器,并实时获取语音识别结果,参考文档使用AudioCapturer开发音频录制功能(ArkTS),更详细接口信息请查看接口文档:AudioCapturer8+和@ohos.net.webSocket (WebSocket连接)。 知识点: 熟悉使用AudioCapturer录音并实时

    2024年04月25日
    浏览(30)
  • 仅需3步!开启Midjourney免费无限做图魔法~

    信息过载时代,用最精简的方式说AI !!紧急更新:原免费免限做图方法已失效,最新降成本方法见以下3.30更新内容 这几天你多半刷到过类似这样的图: 将信将疑? 那咱们来看看AIGC图片生成领域的当红炸子鸡【Midjourney】能做些什么吧。 街拍大片 卡通漫画 甚至-汽车设计图

    2024年04月16日
    浏览(23)
  • Stable Diffusion:开启AI魔法绘画的无限可能

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 随着人工智能技术的蓬勃发展,图像生成和艺术创作领域掀起了一股新的浪潮。在这股浪潮中,Stable Di

    2024年02月04日
    浏览(38)
  • 揭秘AI魔法绘画:Stable Diffusion引领无限创意新纪元

    随着科技的飞速发展,人工智能已经渗透到我们生活的方方面面。在艺术领域,AI技术的应用也日益广泛,为我们带来了前所未有的视觉体验。今天,我们将探讨一种名为Stable Diffusion的AI魔法绘画技术,它如何挑战无限可能,为艺术家和设计师提供全新的创作空间。 首先,让

    2024年02月05日
    浏览(53)
  • Spring Boot实践:构建WebSocket实时通信应用程序并创建订阅端点

    作为一款流行的Java开发框架,Spring Boot可以轻松地集成WebSocket。WebSocket能够为Web应用程序提供实时通信功能,而Spring Boot的优秀特性使得它可以很容易地实现WebSocket的集成。在本篇文章中,我们将演示如何使用Spring Boot框架来构建一个简单的WebSocket应用程序。 1. 创建Spring Boo

    2024年02月01日
    浏览(47)
  • 实时通信应用的开发:Vue.js、Spring Boot 和 WebSocket 整合实践

    目录 1. 什么是webSocket  2. webSocket可以用来做什么? 3. webSocket协议 4. 服务器端 5. 客户端 6. 测试通讯 WebSocket 是一种在单个 TCP连接 上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允 许服务端主动向客户端推送数据 。在WebSocket API中,浏览

    2024年02月11日
    浏览(46)
  • 数字魔法AI绘画的艺术奇迹-用Stable Diffusion挑战无限可能【文末送书-12】

    随着人工智能技术的迅猛发展,AI在各个领域展现出惊人的创造力和潜力。在艺术领域,AI技术已经开始崭露头角,其中一项引人注目的技术就是AI魔法绘画。通过机器学习和深度学习算法,AI不仅能够模仿人类艺术家的风格,还能够创造出独一无二的数字艺术品。本文将深入

    2024年02月04日
    浏览(49)
  • Qt魔法书:打造自定义鼠标键盘脚本

    在我们的日常生活和工作中,脚本扮演着重要的角色。它们就像是一种“自动化的魔法”,可以帮助我们完成各种复杂、繁琐的任务,从而提高效率,节省时间。这就像是我们拥有了一个个小助手,他们可以按照我们的指示,自动完成我们需要的工作。 脚本的重要性不仅体现

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包