关于WebSocket一二三

2023-12-06 23:08
文章标签 websocket 一二三

本文主要是介绍关于WebSocket一二三,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 何为WebSocket

WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。其本质是一种网络通信协议,RFC6455 定义了它的通信标准。

2 为什么需要WebSocket

讲Websocket之前,先来说一说HTTP。HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。http long poll ,或者ajax轮询都可以实现实时信息传递。

ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。long poll其实原理跟 ajax轮询差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。何为被动性呢,其实就是服务端不能主动联系客户端,只能有客户端发起。这就造成轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。

ajax轮询需要服务器有很快的处理速度和资源。long poll 需要有很高的并发,也就是说同时接待客户的能力。

WebSocket因此而诞生。WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。

3 WebSocket工作过程

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

浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。

看一个典型的 WebSocket 握手:
① 客户端发送请求:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

上面代码中:
Upgrade: websocketConnection: Upgrade是WebSocket的核心,告诉 Apache 、 Nginx 等服务器:客户端所发起的是WebSocket协议。
Sec-WebSocket-Key是一个 Base64 encode 的值,这个是浏览器随机生成的,用来询问服务器是否是支持WebSocket;
Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议;
Sec-WebSocket-Version是告诉服务器所使用的 WebSocket Draft (协议版本)。
② 服务器返回结果,表示已经接受到请求, 成功建立WebSocket:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

Upgrade: websocketConnection: Upgrade告诉客户端即将升级的是 Websocket 协议;
Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,用来说明自己是WebSocket助理服务器;
Sec-WebSocket-Protocol则是表示最终使用的协议。

当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。

基于多线程或多进程的服务器无法适用于 WebSockets,因为它旨在打开连接,尽可能快地处理请求,然后关闭连接。任何实际的 WebSockets 服务器端实现都需要一个异步服务器。

4 WebSocket建立

在客户端,没有必要为 WebSockets 使用 JavaScript 库。实现 WebSockets 的 Web 浏览器将通过 WebSockets 对象公开所有必需的客户端功能(主要指支持 Html5 的浏览器)。

4.1 创建 WebSocket 对象
var Socket = new WebSocket(url, [protocol] );

以上代码中的第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。

4.2 WebSocket 属性

假定我们使用了以上代码创建了 Socket 对象,则该对象具有以下属性:

属性描述
Socket.readyState只读属性 readyState 表示连接状态,可以是以下值:0 - 表示连接尚未建立;1 - 表示连接已建立,可以进行通信;2 - 表示连接正在进行关闭;3 - 表示连接已经关闭或者连接不能打开。
Socket.bufferedAmount只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。
4.3 WebSocket 事件

以下是建立的Socket 对象的相关事件:

事件事件处理程序描述
openSocket.onopen建立连接时触发
messageSocket.onmessage客户端接收服务端数据时触发
errorSocket.onerror通信发生错误时触发
closeSocket.onclose连接关闭时触发
4.4 WebSocket 方法

建立的Socket对象具有如下的方法:

方法描述
Socket.send()使用连接发送数据
Socket.close()关闭连接

5 示例:

WebSocket 协议本质上是一个基于 TCP 的协议。

为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息”Upgrade: WebSocket”表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。

// 初始化一个 WebSocket 对象
var ws = new WebSocket("ws://localhost:9998/echo");// 建立 web socket 连接成功触发事件
ws.onopen = function () {// 使用 send() 方法发送数据ws.send("发送数据");alert("数据发送中...");
};// 接收服务端数据时触发事件
ws.onmessage = function (evt) {var received_msg = evt.data;alert("数据已接收...");
};// 断开 web socket 连接成功触发事件
ws.onclose = function () {alert("连接已关闭...");
};

这篇关于关于WebSocket一二三的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/463685

相关文章

一二三应用开发平台应用开发示例(4)——视图类型介绍以及新增、修改、查看视图配置

调整上级属性类型 前面为了快速展示平台的低代码配置功能,将实体文件夹的数据模型上级属性的数据类型暂时配置为文本类型,现在我们调整下,将其数据类型调整为实体,如下图所示: 数据类型需要选择实体,并在实体选择框中选择自身“文件夹” 这时候,再点击生成代码,平台会报错,提示“实体【文件夹】未设置主参照视图”。这是因为文件夹选择的功能页面,同样是基于配置产生的,因为视图我们还没有配置,所以会报错。

前端微信网页授权+WebSocket

这篇教程只介绍前端需要做的工作; 注意: 1,开发者必须关注公众号,且是公众号下的开发者; 2,域名地址必须是公众号绑定的域名地址; 微信授权需要调试工具:微信web开发者工具; 参考微信文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 微信授权,前端与服务端的交互只涉及appId,code,和re

websocket 安全通信

WebSocket 协议 WebSocket:在 2008 年诞生,2011 年成为国际标准。它允许服务器主动向客户端推送信息,客户端也可以主动向服务器发送信息,实现了真正的双向平等对话。它是一种在单个 TCP 连接上进行全双工通讯的协议,能够更高效地进行实时通信。 传统的轮询:浏览器需要不断地向服务器发出 HTTP 请求,浪费带宽和服务器资源。 WebSocket 的优点: 建立在 T

基于springboot websocket和okhttp实现消息中转

1、业务介绍 消息源服务的消息不能直接推给用户侧,用户与中间服务建立websocket连接,中间服务再与源服务建立websocket连接,源服务的消息推给中间服务,中间服务再将消息推送给用户。流程如下图: 此例中我们定义中间服务A的端口为8082,消息源头服务B的端口为8081,方便阅读下面代码。 说明:此例子只实现了中间服务的转发,连接的关闭等其他逻辑并没有完善,如需要请自行完善; 2、中

Spring Boot + WebSocket 实现 IM 即时通讯

文章目录 1. 项目环境准备2. 配置WebSocket3. 创建消息处理器4. 创建消息类5. 创建前端页面6. 启动应用并测试7. 分析与扩展结论 🎉欢迎来到SpringBoot框架学习专栏~ ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹✨博客主页:IT·陈寒的博客🎈该系列文章专栏:SpringBoot📜其他专栏:Java学习路线 Java面试技巧 J

深入研究websocket直播中signature这个参数怎么来的,模拟自己生成一个

上一节课我们已经找到了生成signature这个字段的代码位置,就是这个B函数,嗯......听起来好像有点奇怪,但是它确实叫B啊,笑死。不管了,看一下里面的逻辑是啥。 注意e参数的内容是: {"app_name": "douyin_web","version_code": "180800","webcast_sdk_version": "1.0.14-beta.0","update_ve

apple watch上watchOS网络低级别和高级别区别,以及使用tcp/udp或者websocket的限制条件

可以直接看官方文档:TN3135: Low-level networking on watchOS | Apple Developer Documentation 高级网络:包括 URLSession 中的 HTTP 和 HTTPS 支持,以及在此之上的任何代码层。 低层网络:包括网络框架、 NSStream 和任何其他直接运行 TCP 连接或 UDP 会话的 API。这包括 URLSes

springboot学习(七十二) webflux中使用WebSocket实现服务端和客户端

文章目录 前言一、服务端1、编写一个WebSocket Session封装类2、编写最重要的handler3、附JsonUtils4、Spring注册 二、客户端1、客户端连接类 前言 springboot中不使用Servlet,而是使用WebFlux的情况下,可以使用其自带的websocket实现websocket的功能,网上大部分例子都只能实现一个最基本的DEMO,不

WGCLOUD的web ssh提示websocket服务连接已断开

这个问题一般是server主机没有开放端口9998,因为9998是web ssh的端口,需要开放 我们只要在防火墙,或者安全软件,把这个端口开放了就可以了

vue部署宝塔nginx配置(获取用户ip地址、反代理访问api接口、websocket转发)

以下配置为我自己的需求,因人而异,如果只是单纯的前端非交互页面,可以不用修改配置。  代码及注释,如下: #解决vue-router设置mode为history,去掉路由地址上的/#/后nginx显示404的问题location / {proxy_http_version 1.1;try_files $uri $uri/ /index.html;}#获取用户真实ip地址proxy