一文带你了解WebSocket与技术原理

news2024/11/26 4:44:23

在这里插入图片描述

文章目录

  • 一、技术发展史
  • 二、什么是WebSocket
  • 三、WebSocket与Socket
  • 四、WebSocket 机制
  • 五、WebSocket API简单实现


在这里插入图片描述

一、技术发展史

在了解WebSocket之前,我们先了解这项技术的发展史,它可以追溯到2008年,当时HTML5规范中引入了该协议作为一种实现实时双向通信的解决方案。

  1. WebSocket出现之前,为了实现实时双向通信,开发人员通常使用轮询或长轮询技术。这种方式效率低下,对服务器造成不必要的负担。

  2. 2008年,HTML5规范中将WebSocket引入,作为一种新的协议来解决实时通信的需求。WebSocket协议通过建立持久化的双向连接,实现了实时通信,并降低了服务器的负载。

  3. 2010年,WebSocket协议的第一个标准版本(RFC 6455)发布。这个标准版本定义了协议的基本特性和数据传输方式,为WebSocket的广泛应用打下了基础。

  4. 随着标准版本的发布,各种浏览器开始逐渐支持WebSocket协议。最早支持该协议的浏览器包括Google Chrome、Safari和Opera等。

  5. 2011年,微软也推出了对WebSocket的支持,使得WebSocket可以在Internet Explorer中使用。这一举措进一步推动了WebSocket的应用发展。

  6. 2013年,WebSocket协议正式成为了Web的标准之一,由W3C(World Wide Web Consortium)负责维护和推进。这个里程碑标志着WebSocket成为Web开发中的重要技术之一。

  7. 随着时间的推移,WebSocket的应用越来越广泛。它被广泛用于实时聊天、在线游戏、实时数据监控等领域,为开发者提供了方便、高效的实时通信解决方案。

它的出现极大地促进了Web应用中实时通信的发展,并为开发人员提供了更好的用户体验和技术选择。

二、什么是WebSocket

WebSocket是一种在客户端和服务器之间实现双向通信的协议。传统的HTTP协议是一种无状态的请求-响应协议,每次请求都需要客户端发起并服务器响应,无法实现实时的双向通信。而WebSocket协议则解决了这个问题,使得服务器可以主动向客户端推送消息,实现了实时的双向通信。

WebSocket协议基于TCP协议,通过在浏览器和服务器之间建立持久化的连接,使得双方可以在无需频繁建立和关闭连接的情况下实现实时通信。与传统的HTTP请求不同,WebSocket建立连接后,客户端和服务器之间可以直接发送数据,而无需等待请求和响应。

WebSocket协议使用了基于帧的消息传递机制,将数据分割为帧并进行传输。它还支持文本和二进制数据的传输,并且允许双方进行握手和心跳检测以保持连接的稳定性。WebSocket还提供了一些API,使得开发者可以方便地进行数据传输和事件处理。

在实际应用中,WebSocket广泛用于实时聊天、在线游戏、实时数据监控等场景,它的优点在于低延迟、高效性和可扩展性。而与传统的轮询或长轮询相比,WebSocket能够更加高效地进行数据传输,减少了服务器的负担,并提供了更好的用户体验。

总而言之,WebSocket是一种实现双向通信的协议,它通过持久化的连接和帧的传输机制,使得客户端和服务器之间可以实时地进行双向数据传输。这项技术为实时通信应用提供了一种高效、可靠的解决方案。

三、WebSocket与Socket

WebSocket和Socket是两种不同的网络通信技术,虽然它们的名字相似,但在功能和应用上有一些区别。

1. Socket(套接字)是一种传统的网络通信技术,用于在不同计算机之间进行数据传输和通信。它提供了一种编程接口,使得应用程序能够通过各种协议(如TCP、UDP等)建立连接和进行数据传输。Socket通常通过客户端-服务器模式进行通信,客户端与服务器建立连接后,可以双向发送和接收数据。

  1. WebSocket是一种基于HTTP协议的全双工通信技术,用于在Web浏览器和服务器之间建立持久化的双向通信。与传统的HTTP请求-响应模式不同,WebSocket允许服务器和浏览器之间进行实时的双向数据传输,而无需通过不断发送请求和接收响应来完成。通过WebSocket,服务器可以主动向浏览器推送数据,同时浏览器也可以向服务器发送数据,实现实时通信。

所以,Socket是一种通用的网络通信接口,用于实现不同计算机之间的数据传输和通信,而WebSocket是一种在Web浏览器和服务器之间实现双向实时通信的技术。WebSocket在应用层面相对更高级和方便,特别适合Web应用程序中需要实时通信的场景,例如实时聊天、实时更新等。而Socket则更加底层,适用于更加灵活和复杂的网络通信需求。

四、WebSocket 机制

以下简要介绍一下 WebSocket 的原理及运行机制。

它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是:

WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样;

WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。

非 WebSocket 模式传统 HTTP 客户端与服务器的交互如下图所示:
在这里插入图片描述

使用 WebSocket 模式客户端与服务器的交互如下图:
在这里插入图片描述

上图对比可以看出,相对于传统 HTTP 每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket 是类似 Socket 的 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

我们再通过客户端和服务端交互的报文看一下 WebSocket 通讯与传统 HTTP 的不同。

在客户端,new WebSocket 实例化一个新的 WebSocket 客户端对象,连接类似ws://yourdomain:port/path 的服务端 WebSocket URL,WebSocket 客户端对象会自动解析并识别为 WebSocket 请求,从而连接服务端端口,执行双方握手过程。

客户端发送数据格式类似于下面的内容:

GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost:8080
Sec-WebSocket-Version: 13

可以看到,客户端发起的 WebSocket 连接报文类似传统 HTTP 报文,”Upgrade:websocket”参数值表明这是 WebSocket 类型请求,“Sec-WebSocket-Key”是 WebSocket 客户端发送的一个 base64 编码的密文,要求服务端必须返回一个对应加密的“Sec-WebSocket-Accept”应答,否则客户端会抛出“Error during WebSocket handshake”错误,并关闭连接。

服务端收到报文后返回的数据格式类似于如下内容:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

“Sec-WebSocket-Accept”的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,“HTTP/1.1 101 Switching Protocols”表示服务端接受 WebSocket 协议的客户端连接,经过这样的请求-响应处理后,客户端服务端的 WebSocket 连接握手成功, 后续就可以进行 TCP 通讯了。读者可以查阅WebSocket 协议栈了解 WebSocket 客户端和服务端更详细的交互数据格式。

在开发方面,WebSocket API 也十分简单,我们只需要实例化 WebSocket,创建连接,然后服务端和客户端就可以相互发送和响应消息,在下文 WebSocket 实现及案例分析部分,可以看到详细的 WebSocket API 及代码实现。

五、WebSocket API简单实现

当使用WebSocket进行通信时,可以使用WebSocket API来实现。下面来说明如何使用WebSocket API进行连接和通信。

1.首先,需要创建一个WebSocket对象,并指定要连接的服务器地址:

let websocket = new WebSocket("ws://example.com/socket");

在上面的代码中,"ws://example.com/socket"是服务器的地址,应根据实际情况进行替换。当创建了WebSocket对象后,浏览器会自动尝试建立与服务器的连接。

2.接下来,可以为WebSocket对象定义一些事件处理程序,以便在不同的事件发生时执行相应的操作。常见的事件包括:

  • open: 连接成功时触发的事件。
  • message: 接收到服务器发送的消息时触发的事件。
  • close: 连接关闭时触发的事件。
  • error: 发生错误时触发的事件。

例如,可以通过如下代码为WebSocket对象添加message事件处理程序:

websocket.onmessage = function(event) {
  let message = event.data;
  console.log("Received message: " + message);
};

在上面的代码中,可以通过event.data来访问接收到的消息数据,并在控制台打印出来。

3.当连接建立后,可以通过WebSocket对象的send方法向服务器发送消息:

websocket.send("Hello, server!");

在上面的代码中,发送了一个字符串消息 “Hello, server!” 到服务器。

4.最后,当不再需要使用WebSocket时,可以通过WebSocket对象的close方法来手动关闭连接:

websocket.close();

通过创建WebSocket对象、处理相应事件、发送和接收消息,可以实现与服务器的实时双向通信。请注意,具体的实现可能会依赖于不同的编程语言和框架,上述示例是基于JavaScript的Web环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】Java核心 80:Git 教程(3)初始化工作区 add与commit

文章目录 04.GIT本地操作-初始化工作区目标内容小结 05.GIT本地操作-add与commit目标内容小结 在Git中,初始化工作区并使用add和commit命令是进行版本控制的基本操作。 下面是对这些操作的简要解释: 初始化工作区:在使用Git之前&#xff0c…

【语音播报】没时间刷新闻热搜?让博灵语音通知终端读给你听!-声光报警灯|语音播报器|Modbus报警灯|网口语音播报|网络语音播报器

背景 每天上班太忙碌,没有时间刷微博,新闻发展的太快,生怕错过微博热搜,看着手边的博灵语音通知终端,决定自己写一个脚本,让它给我读新闻! 少废话,先看东西 实现了以下效果 每90…

02 快速定位关键点并爆破

vm所进行的代码级的保护是对于软件保护的最后一层 1、API断点法 如何切换到程序的代码节的位置? 》od点击e->双击xxx.exe即可 程序需要读取文本框输入的内容,所以肯定会调用GetWindowText函数,所以可以ctrlg然后输入GetWindowText进行…

ChatGPT 和 Elasticsearch:分面、过滤和更多上下文

作者:Luca Wintergerst 在最近的一篇博客文章中,我们讨论了 ChatGPT 和 Elasticsearch 如何协同工作以帮助更有效地管理专有数据。 通过利用 Elasticsearch 的搜索功能和 ChatGPT 的上下文理解,我们演示了如何改进结果。 在这篇文章中&#…

制造业数字化转型难?低代码带来曙光

概要:制造业企业在数字化转型中一直面临着许多困难和挑战,中小企业更是如此。天翎低代码平台通过自身可视化设计、私有化部署、灵活性、扩展性和兼容性等特性,帮助制造业企业更好地完成数字化转型目标。不仅如此,天翎还推出了微鳄…

iview tree树形控件多选,自定义内容

项目中需要一个iview框架的树形控件,需要里面包含以下功能 1、控件宽度可展开,可缩小2、树形控件可搜索,并且定位到搜索的节点3、控件可以一键勾选,一键取消4、控件图标自定义5、 点击最后一个节点时可以进入到二级节点,点击上一节点可返回完整代码:listToTree文件 效果图: 具…

标准模版库 知识点总结 C++程序设计与算法笔记总结(八) 北京大学 郭炜

标准模版库 https://blog.csdn.net/shaozheng0503/article/details/129101932?ops_request_misc%257B%2522request%255Fid%2522%253A%2522168802585416800211563089%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id1688025854168…

前端判断img图片未能正确加载时显示一个默认图片。img标签onerror事件设置了本地默认图片还是不显示的问题

前端img标签中引用后端交给的图片地址时,有可能这个路径下图片被删除或者损坏了,那么页面在加载img图片时就显示为,太丑了。 img标签有个onerror事件,就是当图片未被正确加载的时候调用此事件,写的时候在onerror事件里…

安装国产系统Kylin-Desktop实战

前言 随着国产化系统的呼声越来越高,再加上今年6月红帽公司发表声明,只有付费才能拿到代码的通告,学习国产化势在必行。 在众多的国产化系统中,我选择了排名比较高的系统,今天我们就一起来安装下麒麟的操作系统 &…

习题-集合框架

目录 1.打印信息 2.ArrayList的使用 User类 测试类 3.Set的使用 汽车类 测试类 4.ArrayList使用 5.新闻 新闻类 测试类 6.返回索引 7.删除重复QQ 8.Map集合操作 9.成绩排序 学生类 测试类 10.Map基础题 学员类 测试类 11.遍历Map综合-国家名称 12.Collec…

1. Linux手写简单的线程池

目录 一、线程池的概念二、线程池的核心组件三、数据结构设计1、任务队列2、线程池 四、接口设计1、创建线程池2、销毁线程池3、抛出任务的接口 五、实现一个线程池及测试1、测试单生成者——多消费者2、测试多生产者——多消费者3、thrd_pool.h4、thrd_pool.c5、main.c6、thrd…

<C语言> 操作符

1.算术操作符 加法():用于将两个操作数相加。减法(-):用于将第一个操作数减去第二个操作数。乘法(*):用于将两个操作数相乘。除法(/):…

使用JavaScript获取随机数序列

使用Javascript 生成随机数 要在 Javascript 中生成随机数,可以使用 Math 对象的 random() 方法。该方法返回一个大于等于 0 小于 1 的伪随机浮点数。 Javascript中的 Math.random() 函数是一个用于生成随机数的内置函数。 MDN 官方解释 Math.random() 函数返回…

idea常用快捷方式,保姆级!图文并茂【建议收藏】

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 给大家分享一下idea在开发过程中使用的快捷方式把,可以极大的提升生产力,提高自己的开发速度,需要在开发中不断地使用,…

《Linux操作系统编程》 第十章 线程与线程控制: 线程的创建、终止和取消,detach以及线程属性

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

arcgis-elasticsearch矢量数据导入及索引设计工具

插件说明 插件支持单图层导入和多图层同时导入,依赖elasticsearch包和urlLib包,使用之前请用pip安装,具体的依赖包的requirements.txt文件放在压缩包里面了。 pip install -r requirements.txt插件下载地址:https://download.cs…

DocuSign:在全球电子签名市场具有巨大上涨潜力的SaaS股

来源:猛兽财经 作者:猛兽财经 总结 (1)DocuSign的核心电子签名业务还在持续增长,尽管在疫情后增速有所放缓,但第一季度的收入已经达到了6.61亿美元,增长率为12%。 (2)Do…

Linux:通过wget下载安装mysql数据库(5.7版本)

目前,主要使用的MySQL有5.7和8.0两个版本,在安装上,5.7和8.0版本基本一致,区别只在于配置root密码和远程登陆上不同。本次将以5.7版本作为对象,进行后续安装。 1.wget下载MySQL安装文件 下载完成,得到mysq…

PySpark如何输入数据到Spark中?【RDD对象】

PySpark支持多种数据的输入,在输入完成后,都会得到一个:RDD类的对象RDD全称为弹性分布式数据集(Resilient Distributed Datasets),PySpark针对数据的处理,都是以RDD对象作为载体,即: •数据存储…

ansible实训-Day3(playbook的原理、结构及其基本使用)

一、前言 该篇是对ansible实训第三天内容的归纳总结,主要包括playbook组件的原理、结构及其基本使用方式。 二、Playbook 原理 Playbook是Ansible的核心组件之一,它是用于定义任务和配置的自动化脚本。 Ansible Playbook使用YAML语法编写,可…