WebSocket实时通讯
创始人
2025-05-31 02:38:32
0

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

http:只能由客户端发起,不能做到服务器主动向客户端推送消息 

WebSocket:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向对话

1.创建WebSocket实例
url:url之前需添加ws://(未加密)或wss://(已加密),类似http://、https://
protocol:与服务端定义的协议名称相同,协议的参数例如XMPP(Extensible Messaging and Presence Protocol)、SOAP(Simple Object Access Protocol)或者自定义协议。

var ws = new WebSocket('ws://url');
var ws1 = new WebSocket('ws://url', 'myprotocol');
var ws2 = new WebSocket('ws://url', ['protocol_1','protovol_2']);

2.属性

①readyState属性:WebSocket当前连接状态

属性值属性常量描述
0CONNECTING正在与服务端建立WebSocket连接,还没有连接成功
1OPEN连接成功并打开,可以发送消息
2CLOSING进行关闭连接的操作,且尚未关闭
3CLOSE连接已关闭或不能打开

通过 ws.readyState属性查看当前连接状态

②bufferedAmount:检查传输数据的大小,当客户端传输大量数据时使用避免网络饱和

通过ws.bufferedAmount属性查看传输数据的大小

③protocol:在构造函数中使用,protocol参数让服务端知道客户端使用的WebSocket协议。而WebSocket对象的这个属性就是指的最终服务端确定下来的协议名称,可以为空

3.WebSocket 对象的相关事件

事件事件处理程序描述
openws.onopen连接建立时触发
messagews.onmessage客户端接收服务端数据时触发
errorws.onerror通信发生错误时触发
closews.onclose连接关闭时触发
      //连接成功后的回调函数ws.onopen = function() {console.log("服务器已连接");};//收到服务器数据后的回调函数ws.onmessage = function(msg) {console.log("来自服务器端的数据:" + msg.data);};//报错时的回调函数ws.onerror = function(event) {console.log(event, "event");};//连接关闭后的回调函数ws.onclose = function() {console.log("服务器关闭");};

4.WebSocket 对象的相关方法

方法描述
ws.send()

使用连接发送数据

ws.close()

关闭连接

      //使用连接发送数据ws.send("your message");//关闭连接ws.onclose = function() {console.log("服务器关闭");};

相关内容

热门资讯

python基础语法【模块 包... 模块 包 异常捕获 1.模块 python一个py文件就是一个模块 1.1 使用方法 1)前提&#x...
在recyclerview中使... 问题描述 最近在使用RecycerView的瀑布流布局,我想直接用ViewBindin...
java中Long型数据大小比... 起因 今天在做项目的时候,想构建一个树形结构,从数据库中查询出了所有数据...
智能控制 | AIRIOT智慧... 许多行业客户在智慧楼宇的建设中主要面临运营管理低效,楼宇内部各个系统相互独立ÿ...
Redis 数据结构 这里写目录标题Redis 数据结构一、String类型String数据类型的使用场景key 的设置约...
基于 MM32SPIN0280... M32SPIN0280 是灵动微电机新推出的针对电机控制市场的专用 MCU,该系列 M...
C++学习(指针、引用、结构体... 1编译软件Visual Studio2基本语法2.1指针2.1.1指针的使用//定义一个指针int ...
【UML】项目开发流程 以下模型是一个项目从启动到最终部署,逐步细化(精化)、实现...
docker-java应用部署 目录          1端口映射 2.Mysql部署 3.Tomcat部署 4.Nginx部署 5...
CentOS操作系统libc.... 使用xshell登陆Linux后查看jdk版本提示 /lib64/libc.so.6: versio...
Linux串口实现树莓派与电脑... 目录 一  串口说明 二  USB—TTL模块 ● usb-ttl模块接口  三  串口通信常用的A...
BeanPostProcess... 文章目录一、BeanPostProcessor的作用1. 源码2. 使用案例二、Spring生命周期...
2023.3.22 文章目录@13:static关键字**一:static修饰变量&...
模糊PID控制双容水箱液位控制... 资源:双容水箱液位模糊PID控制MATLAB仿真-电子商务文档类资源-CSDN文库模糊...
基于springboot家政服... 大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里...
提升代码质量,使用插件对 ja... 目录前言一、使用maven-checkstyle-plugin插件1. maven-checksty...
VSCode配置git bas... 打开左下角齿轮图标      打开Settings 搜索框输入 terminal.integrat...
Winform控件开发(21)... 一、属性 1、Name 用于获取控件对象 2、Anchor 锚定控件对于父控件的位置 3、BackC...
【kubernetes云原生】... 目录 一、标签选择器来源 二、什么是标签选择器 2.1 标签选择器概述 2.2 标签选择器概述属性 ...
重构条件-Replace Ne... 重构条件-Replace Nested Conditional with Guard Clauses...