您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2023-11-09 12:34:04  来源:京东云开发者  作者:

1、背景

 

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

2、什么是 websocket

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

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

3、工作原理

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

4、与 HTTP 的关系

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

相同点:

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. = function () {

console.log('连接错误');

};

5.2 weboscket 事件

事件处理程序描述openonopen连接建立时触发messageonmessage接收消息时触发error发生错误时触发closeonclose关闭连接时触发

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. = 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/ target=_blank class=infotextkey>Python 语言,需依托 tornado 框架搭建后端 web 服务端,文章中不再说明如何搭建服务端,感兴趣的小伙伴可自行尝试。tornado 内置 websocket 模块,能更简单的支持使用 websocket。

6、总结

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

实用点:

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

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

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

 

作者:京东物流 骆铜磊
来源:京东云开发者社区 自猿其说 Tech 转载请注明来源


Tags:WebSocket   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: WebSocket  点击:(9)  评论:(0)  加入收藏
浅谈WebSocket协议在Web领域的应用
Part 01、WebSocket是什么? WebSocket是一种在Web应用程序中提供双向通信的协议。它允许服务器主动向客户端推送数据,而不是像传统的HTTP请求-响应模式一样,客户端必须发送请...【详细内容】
2023-12-08  Search: WebSocket  点击:(199)  评论:(0)  加入收藏
WebSocket基本使用方法
WebSocket是一种双向、单套接字连接,使用WebSocket,那么请求就变成了打开WebSocket连接的单一请求,并且可以重用公客户端到服务器以及服务器到客户端的同一连接。WebSock减少延...【详细内容】
2023-12-02  Search: WebSocket  点击:(187)  评论:(0)  加入收藏
你不知道的Websocket协议,这次给你讲明白!
前言初次接触 websocket 的人,可能都会有这样的疑问:我们已经有了 http 协议,为什么还需要websocket协议?它带来了什么好处?原因是http每次请求只能由客户发起,而websocket最大特...【详细内容】
2023-11-29  Search: WebSocket  点击:(193)  评论:(0)  加入收藏
实时协作的秘诀:RabbitMQ与WebSockets的结合
实时协作是现代软件开发中非常重要的一个方面。为了实现实时协作,一种常见的做法是将消息队列与WebSocket技术相结合。其中,RabbitMQ是一个功能强大的消息队列系统,它能够有效...【详细内容】
2023-11-21  Search: WebSocket  点击:(176)  评论:(0)  加入收藏
WebSocket 魔法师:打造实时应用的无限可能
1、背景 在开发一些前端页面的时候,总是能接收到这样的需求:如何保持页面并实现自动更新数据呢?以往的常规做法,是前端使用定时轮询后端接口,获取响应后重新渲染前端页面,这种做法...【详细内容】
2023-11-09  Search: WebSocket  点击:(197)  评论:(0)  加入收藏
什么是WebSocket ,一文了解
WebSocket 允许我们创建“实时”应用程序,与传统 API 协议相比,该应用程序速度更快且开销更少。一、WebSocket 是如何工作的按照传统的定义,WebSocket是一种双工协议,主要用于客...【详细内容】
2023-10-03  Search: WebSocket  点击:(148)  评论:(0)  加入收藏
实时数据推送并非只有WebSocket一种选择
环境:SpringBoot2.7.16概述在Web应用中,有几种实时数据推送的选择方案,包括SSE(Server-Sent Events)、WebSocket、长轮询等。SSE是一种基于HTTP协议的服务器向客户端推送数据的技...【详细内容】
2023-09-27  Search: WebSocket  点击:(405)  评论:(0)  加入收藏
SpringBoot使用WebSocket实现即时消息
当以jar包形式运行时需要配置该bean,暴露我们配置的@ServerEndpoint;当我们以war独立tomcat运行时不能配置该bean。这里有个g-messages.js文件是我写的一个工具类,用来做连接及...【详细内容】
2023-08-14  Search: WebSocket  点击:(253)  评论:(0)  加入收藏
SpringBoot整合WebSocket详解
环境:Springboot3.0.5WebSocket介绍WebSocket协议RFC 6455提供了一种标准化的方式,通过一个TCP连接在客户端和服务器之间建立全双工、双向的通信通道。它是一个不同于HTTP的TC...【详细内容】
2023-08-09  Search: WebSocket  点击:(369)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条