使用AI写WebSocket知识是一种怎么样的体验?

news2024/11/15 21:54:43

一、WebSocket基础知识

1. WebSocket概念

1.1 为什么会出现WebSocket

一般的Http请求我们只有主动去请求接口,才能获取到服务器的数据。例如前后端分离的开发场景,自嘲为切图仔的前端大佬找你要一个配置信息的接口,我们后端开发三下两下开发出一个RESTful架构风格的API接口,只有当前端主动请求,后端接口才会响应。

但上文这种基于HTTP的请求-响应模式并不能满足实时数据通信的场景,例如游戏、聊天室等实时业务场景。现在救世主来了,WebSocket作为一款主动推送技术,可以实现服务端主动推送数据给客户端。大家有没听说过全双工、半双工的概念。

全双工通信允许数据同时双向流动,而半双工通信则是数据交替在两个方向上传输,但在任一时刻只能一个方向上有数据流动

HTTP通信协议就是半双工,而数据实时传输需要的是全双工通信机制,WebSocket采用的便是全双工通信。举个微信聊天的例子,企业微信炸锅了,有成百条消息轰炸你手机,要实现这个场景,大家要怎么设计?用iframe、Ajax异步交互技术配合以客户端长轮询不断请求服务器数据也可以实现,但造成的问题是服务器资源的无端消耗,运维大佬直接找到你工位来。显然服务端主动推送数据的WebSocket技术更适合聊天业务场景。

1.2 WebSocket优点

大家先看看传统的Ajax长轮询和WebSocket性能上掰手腕谁厉害。在websocket.org网站提供的Use Case C的测试里,客户端轮询频率为10w/s,使用Poling长轮询每秒需要消耗高达665Mbps,而我们的新宠儿WebSocet仅仅只需要花费1.526Mbps,435倍的差距!!

为什么差距会这么大?胡广告诉你,WebSocket技术设计的目的就是要取代轮询技术和Comet技术。Http消息十分冗长和繁琐,一个Http消息就要包含了起始行、消息头、消息体、空行、换行符,其中请求头Header非常冗长,在大量Http请求的场景会占用过多的带宽和服务器资源。

大家看下百度翻译接口的Http请求,拷贝成curl命令是非常冗长的,可用的消息肉眼看过去没多少。

curl ^"https://fanyi.baidu.com/mtpe-individual/multimodal?query=^%^E6^%^B5^%^8B^%^E8^%^AF^%^95&lang=zh2en^" ^
  -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" ^
  -H "Accept-Language: zh-CN,zh;q=0.9" ^
  -H "Cache-Control: max-age=0" ^
  -H "Connection: keep-alive" ^
  -H ^"Cookie: BAIDUID=C8FA8569F446CB3F684CCD2C2B32721E:FG=1; BAIDUID_BFESS=C8FA8569F446CB3F684CCD2C2B32721E:FG=1; ab_sr=1.0.1_NDhjYWQyZmRjOWIwYjI3NTNjMGFiODExZWFiMWU4NTY4MjA2Y2UzNGQwZjJjZjI1OTdlY2JmOThlNzk1ZDAxMDljMTA2NTMxYmNlM1OTQ1MTE0ZTI3Y2M0NTIzMzdkMmU2MGMzMjc1OTRiM2EwNTJQ==; RT=^\^"z=1&dm=baidu.com&si=b9941642-0feb-4402-ac2b-a913a3eef1&ss=ly866fx&sl=4&tt=38d&bcn=https^%^3A^%^2F^%^2Ffclog.baidu.com^%^2Flog^%^2Fweirwood^%^3Ftype^%^3Dp&ld=ccy&ul=jes^\^"^" ^
  -H "Sec-Fetch-Dest: document" ^
  -H "Sec-Fetch-Mode: navigate" ^
  -H "Sec-Fetch-Site: same-origin" ^
  -H "Sec-Fetch-User: ?1" ^
  -H "Upgrade-Insecure-Requests: 1" ^
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" ^
  -H ^"sec-ch-ua: ^\^"Not/A)Brand^\^";v=^\^"8^\^", ^\^"Chromium^\^";v=^\^"126^\^", ^\^"Google Chrome^\^";v=^\^"126^\^"^" ^
  -H "sec-ch-ua-mobile: ?0" ^
  -H ^"sec-ch-ua-platform: ^\^"Windows^\^"^" &

而WebSocket是基于帧传输的,只需要做一次握手动作就可以让客户端和服务端形成一条通信通道,这仅仅只需要2个字节。我搭建了一个SpringBoot集成的WebSocket项目,浏览器拷贝WebSocket的Curl命令十分简洁明了,大家对比下。

curl "ws://localhost:8080/channel/echo" ^
  -H "Pragma: no-cache" ^
  -H "Origin: http://localhost:8080" ^
  -H "Accept-Language: zh-CN,zh;q=0.9" ^
  -H "Sec-WebSocket-Key: VoUk/1sA1lGGgMElV/5RPQ==" ^
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" ^
  -H "Upgrade: websocket" ^
  -H "Cache-Control: no-cache" ^
  -H "Connection: Upgrade" ^
  -H "Sec-WebSocket-Version: 13" ^
  -H "Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits"

如果你要区分Http请求或是WebSocket请求很简单,WebSocket请求的请求行前缀都是固定是ws://

2. WebSocket实践

2.1 集成WebSocket服务器

大家要在SpringBoot使用WebSocket的话,可以集成spring-boot-starter-websocket,引入胡广下面给的pom依赖。

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>
	</dependencies>

感兴趣点开spring-boot-starter-websocket依赖的话,你会发现依赖所引用包名为package jakarta.websocket。这代表SpringBoot其实是集成了Java EE开源的websocket项目。这里有个小故事,Oracle当年决定将Java EE移交给Eclipse基金会后,Java EE就进行了改名,现在Java EE更名为Jakarta EE。Jakarta是雅加达的意思,有谁知道有什么寓意吗,评论区告诉我下?

我们的程序导入websocket依赖后,应用程序就可以看成是一台小型的WebSocket服务器。我们通过@ServerEndpoint可以定义WebSocket服务器对客户端暴露的接口。

@ServerEndpoint(value = "/channel/echo")

而WebSocket服务器要推送消息给到客户端,则使用package jakarta.websocket下的Session对象,调用sendText发送服务端消息。

    private Session session;
    
    @OnMessage
    public void onMessage(String message) throws IOException{
        LOGGER.info("[websocket] 服务端收到客户端{}消息:message={}", this.session.getId(), message);
        this.session.getAsyncRemote().sendText("halo, 客户端" + this.session.getId());
    }

看下getAsyncRemote方法返回的对象,里面是一个远程端点实例。

    RemoteEndpoint.Async getAsyncRemote();

2.2 客户端发送消息

客户端发送消息要怎么操作?这点还和Http请求很不一样。后端开发出接口后,我们在Swagger填充参数,点击Try it out,Http请求就发过去了。

但WebSocket需要我们在浏览器的控制台上操作,例如现在胡广要给我们的WebSocket服务器发送Halo,JavaGetOffer,可以在浏览器的控制台手动执行以下命令。

websocket.send("Halo,JavaGetOffer");

实践的操作界面如下。

 二、感受下chatGPT4生成的文章(我感觉一般)

1. WebSocket概念

  • 什么是WebSocket: WebSocket是一种通信协议,专为在客户端和服务器之间实现实时双向通信而设计。不同于HTTP协议的“请求-响应”模式,WebSocket允许在单个TCP连接上进行全双工通信。
  • 工作原理: WebSocket连接通过一个初始的HTTP请求来建立,称为“WebSocket握手”。一旦握手成功,连接就切换为WebSocket协议,允许数据在客户端和服务器之间低延迟地传输。连接保持打开状态,直到明确关闭。
  • 适用场景: 主要用于需要实时更新的应用场景,如在线聊天、实时数据推送、在线游戏、股票交易系统等。WebSocket的低延迟特性使其成为这些场景的理想选择。

2. WebSocket实践举例

  • 在线聊天应用: 描述如何使用WebSocket实现一个简单的在线聊天应用。客户端通过WebSocket连接到服务器,服务器将消息广播给所有连接的客户端,实现实时的消息传递。
  • 股票实时更新系统: 通过WebSocket向客户端推送股票价格的实时更新,使用户能够在浏览器中看到最新的市场动向,保持交易的即时性和准确性。
  • 多人在线游戏: 讨论如何利用WebSocket实现游戏中的玩家位置、动作等信息的实时同步,以确保玩家在同一个虚拟世界中的一致体验。

3. 相较于其它的有哪些优势和劣势

  • 优势:
    • 低延迟: WebSocket的设计使得它在保持连接的同时能够以极低的延迟进行数据传输,这对实时应用非常关键。
    • 全双工通信: 允许服务器和客户端之间同时发送和接收数据,而不需要像HTTP那样的轮询或长连接,降低了服务器的负担。
    • 节省带宽: WebSocket连接在初始化后,不再需要额外的HTTP头部信息,从而减少了数据开销,节省了带宽。
  • 劣势:
    • 复杂性: WebSocket的实现和调试相对复杂,尤其是在处理连接管理、错误处理和安全方面。
    • 不适合所有场景: 对于不需要实时双向通信的应用,使用WebSocket可能会造成不必要的复杂性和资源消耗。
    • 服务器资源消耗: 持久连接需要服务器维持大量的活动连接,在高并发场景下可能导致资源消耗过高。

4. 感叹一下现在的AI环境

  • AI与开发的关系: 讨论当前AI技术如何帮助开发者更高效地进行代码编写、调试和优化,减少重复性劳动。例如,AI驱动的代码生成工具能够根据自然语言描述自动生成WebSocket实现代码,降低了入门门槛。
  • AI是否真的是大趋势: 从AI在各个行业的快速渗透和广泛应用的角度讨论,AI的确已经成为一种大趋势。分析AI对编程语言、开发流程的影响,以及如何加速软件开发的自动化和智能化。
  • Python的崛起: Python作为AI和数据科学领域的主要编程语言,其市场份额的持续增长表明了AI和数据驱动开发的快速发展。解释Python的优势,例如其简洁的语法和强大的生态系统,如何帮助开发者在AI领域快速实现创新.

感觉其实也没那么牛叉,只是一般般而已,写的都是些套话,没有一点主见思维。不知道付费的gpt5咋样。看起来也就是:

1、回复的数据量更加的大

2、文件能上传

3、网页能访问

4、图片生成的多一些

一个月20刀,啧啧啧心疼的嘞。不过对于高度使用的用户来看,收益远远大于投入

三、 最后整点面试题干货(你们看到这题目会不会懵逼呢?)

包懵逼的,这些对于没学过的人毫无意义,不用记啦,当做笑话随便看看,老老实实去学websocket基础知识吧,学完再去动手做比啥都强

1. 什么是WebSocket?它与HTTP有什么区别?

答案: WebSocket是一种在单个TCP连接上提供全双工通信的协议。与HTTP不同,WebSocket允许服务器主动向客户端发送数据,而不需要客户端轮询。这使得WebSocket非常适合于实时应用。

2. WebSocket如何建立连接?

答案: WebSocket连接通过HTTP协议的Upgrade请求从普通的HTTP连接升级而来。客户端发送一个带有Upgrade: websocket的HTTP请求,服务器响应并确认升级,从而建立WebSocket连接。

3. WebSocket在什么时候适用?

答案: WebSocket适用于需要实时数据交换的应用场景,如即时聊天、在线游戏、股票行情更新、在线协作工具等。

4. WebSocket的握手过程是如何进行的?

答案: WebSocket握手过程开始于客户端发送一个带有Upgrade: websocket头的HTTP请求。服务器如果支持WebSocket协议,会返回一个带有101 Switching Protocols状态码的响应,从而升级连接为WebSocket。

5. 如何在WebSocket中实现安全通信?

答案: WebSocket可以通过使用wss://协议(WebSocket Secure)实现加密通信,类似于HTTPS。这依赖于底层的SSL/TLS加密。

6. WebSocket如何处理数据帧?

答案: WebSocket通信中的数据被分割为帧传输。每个数据帧包含了帧的类型、长度、以及实际数据内容。WebSocket支持文本帧和二进制帧,服务器和客户端通过这些帧交换信息。

7. WebSocket是否支持跨域?

答案: WebSocket默认支持跨域连接,但浏览器会进行Origin检查以防止CSRF攻击。服务器需要检查并决定是否允许来自特定Origin的连接。

8. WebSocket连接中断后,如何重连?

答案: 当WebSocket连接中断时,客户端可以使用JavaScript代码检测连接状态,并在断开时通过设定重连机制(如指数退避算法)重新发起连接。

9. WebSocket的ping/pong机制是什么?

答案: WebSocket协议提供了ping/pong帧来检测连接的状态。客户端或服务器可以发送ping帧,另一端应回复pong帧。这有助于确保连接保持活跃,检测连接是否仍然有效。

10. WebSocket如何与传统HTTP服务器共存?

答案: WebSocket可以与传统HTTP服务器共存,通常通过同一个服务器端口。通过HTTP的Upgrade头,WebSocket连接可以在同一服务器上与HTTP请求并行处理。

11. WebSocket的负载均衡如何实现?

答案: WebSocket连接是持久的,因此负载均衡通常在连接初期由负载均衡器决定。如果使用了多台服务器,可以通过Sticky Sessions(会话保持)或WebSocket代理来确保后续通信由同一服务器处理。

12. 如何处理WebSocket中的大数据量传输?

答案: 对于大数据量的传输,WebSocket可以将数据分割为多个帧(fragmentation),每个帧依次发送,直到所有数据传输完成。这样可以避免单个大数据帧占用过多内存或网络带宽。

13. WebSocket在高并发场景下的表现如何?

答案: WebSocket在高并发场景中表现良好,因为它基于事件驱动模型,适合处理大量并发连接。然而,服务器端需要有效管理资源(如线程、内存),以避免瓶颈和性能下降。

14. 如何在WebSocket中进行身份验证和授权?

答案: WebSocket本身不包含身份验证机制,通常是在连接建立前通过HTTP请求进行身份验证。在连接建立后,可以通过自定义协议或使用JSON Web Tokens (JWT)在WebSocket通信中实现授权。

15. WebSocket有哪些替代方案?

答案: WebSocket的替代方案包括Server-Sent Events (SSE)和HTTP长轮询。SSE适用于单向服务器推送场景,而HTTP长轮询通过定期重新建立HTTP连接来模拟实时通信,但效率不如WebSocket高

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

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

相关文章

Edge PDF 关闭 提供支持的应用Adobe Acrobat

Edge 在浏览PDF时启用 Adobe Acrobat支持后&#xff0c;对一些长PDF会出现上下滚动会出现无法正常显示PDF内容的情况。在关闭了Adobe Acrobat计算支持后&#xff0c;问题得到解决。关闭Adobe Acrobat的方式如下&#xff1a; 1. Edge地址栏输入 edge://flags &#xff0c;进入如…

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentSkipListSet

SkipList SkipList&#xff08;跳表&#xff09;是一种有序链表加多级索引数据结构&#xff0c;基于有序的单链表&#xff0c;类似于平衡二叉树&#xff0c;但其查找、插入和删除操作的时间复杂度都是 O(logN)&#xff0c;并且不需要进行旋转平衡等复杂操作。 跳表利用二分查…

【滑动窗口】将 x 减到 0 的最小操作数

将 x 减到 0 的最小操作数 将 x 减到 0 的最小操作数题目思路讲解代码书写 将 x 减到 0 的最小操作数 题目 题目链接: 将 x 减到 0 的最小操作数 思路讲解 按照题目的思路去做这一题是非常恶心的, 因此我们采用正难则反思路. 将问题转换为: 求中间某一个最长的数组长度, 使…

mybatis搭建,参数传递,增删改查事务管理

1.mybatis概述 原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了 Google Code&#xff0c;随着开发团队转投Google Code 旗下&#xff0c; iBatis3.x正式更名为MyBatis。 MyBatis 是一款优秀的持久层框架。 框架就是对技术的封装&am…

Spring源码之reader、scanner

目录 1.Spring的整体启动流程 2.reader 3.Scanner ApplicationContext的三种加载应用上下文的方式&#xff08;创建Spring容器&#xff09;&#xff1a; AnnotationConfigApplicationContextClassPathXmlApplicationContextFileSystemXmlApplicationContext 1.Spring的整体…

SprinBoot+Vue阅读交流微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

观测云核心技术解密:eBPF Tracing 实现原理

前言 eBPF 是一种强大的内核技术&#xff0c;允许在内核中安全地执行自定义代码。通过 eBPF&#xff0c;开发者可以在不修改内核源码的情况下&#xff0c;对内核功能进行扩展和监控。eBPF Tracing 利用这一技术&#xff0c;对系统调用、内核函数等进行跟踪&#xff0c;从而实现…

X86架构(六)——移位指令与无条件转移指令

移位指令 shr 逻辑右移 逻辑右移指令会将操作数连续地向右移动指定的次数&#xff0c;移出的比特被移到标志寄存器的CF位&#xff0c;左边空出来的位置用0填充 ;目的操作数可以是8位或16位的通用寄存器或者内存单元 ;源操作数可以是数字1、8位立即数或者寄存器CL shr r/m8, …

7、Django Admin删除默认应用程序

admin文件 from django.contrib.auth.models import User, Groupadmin.site.unregister(User) admin.site.unregister(Group) 显示效果&#xff1a; 前 后

使用vscode debug cpp/python混合编程的程序(从python调用的C++编译的dll)

使用vscode debug cpp/python混合编程的程序&#xff08;从python调用的C编译的dll&#xff09; 1. 安装插件 Python C Debugger https://marketplace.visualstudio.com/items?itemNamebenjamin-simmonds.pythoncpp-debug 2. 在.vscode/launch.json中增加配置 拷贝自 https:…

K8S日志收集

本章主要讲解在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志&#xff0c;包括程序直接输出到控制台日志、自定义文件日志等。 一、有哪些日志需要收集 为了更加方便的处理异常&#xff0c;日志的收集与分析极为重要&#xff0c;在学习日志收集之前&#xff0c;需要知…

矮草坪渲染尝试

本来说写unity里的&#xff0c;由于three测试方便&#xff0c;先试试three 这个图片是目标效果 可以看见草很矮&#xff0c;很密集&#xff0c;如果用instance来绘制的话&#xff0c;遭不住的 忽然发现这个效果很像绒毛效果 于是找了博客康康 https://zhuanlan.zhihu.com/p/256…

第二证券:涨停潮!传手机将使用钛金属外壳?

今天早盘&#xff0c;银行股再度重挫&#xff0c;导致上证指数、上证50纷乱创出阶段性新低&#xff0c;上证指数跌破2800点&#xff0c;小盘成长股则大面积反弹&#xff0c;创业板指、科创50等股指飘红。 盘面上&#xff0c;新式烟草、钛金属、锂矿、玻璃基板等板块涨幅居前&a…

glsl着色器学习(七)

先了解一个矩阵库twgl/m4 是一个4x4 矩阵数学转换函数的库 normalize(a, dst) 将一个向量除以它的欧几里得长度&#xff0c;归一化后返回参数"a"是一个vec3&#xff08;三维向量&#xff09;参数"dst"是用来接收结果的&#xff0c;如果不传&#xff0c;则…

【嵌入式体系结构复习资料】

选择&#xff1a; 1. 以下哪个不是嵌入式系统设计的主要目标&#xff1f;( D ) A&#xff0e;低成本 B.低功耗 C.实时要求高 D.超高性能 2&#xff0e; 嵌入式系统有别于其他系统的最大特点是&#xff08;A &#xff09;。 A&#xff0e;嵌入专用 B.高可靠 C.…

集成电路学习:什么是LCD液晶显示器

一、LCD&#xff1a;液晶显示器 LCD&#xff0c;全称Liquid Crystal Display&#xff0c;即液晶显示器&#xff0c;是一种平面超薄的显示设备。它由一定数量的彩色或黑白像素组成&#xff0c;放置于光源或者反射面前方。LCD的主要原理是以电流刺激液晶分子产生点、线、面配合背…

mysql 使用 general 开启SQL跟踪功能

查看当前状态 mysql> SHOW VARIABLES LIKE %general%; 启用 临时启用 SET GLOBAL general_logon; SET GLOBAL general_log_file/tmp/general.log; 永久启用 通过修改配置文件来启用,需要重启mysql服务 [mysqld] general_logON general_log_file/tmp/general.log 再次查看状态…

【保姆级教程】如何在Win11上搭建一个GPU环境

CUDA和CUDNN安装 CUDA安装 下载对应cuda环境 下载链接&#xff1a;https://developer.nvidia.com/cuda-downloads&#xff0c;图片下载的是 cuda_12.6.1_560.94_windows.exe 然后一路安装即可&#xff1a; 安装路径如下&#xff1a; CUDNN安装 打开cuDNN下载页面 解压后…

排查SQL Server中的内存不足及其他疑难问题

文章目录 引言I DMV 资源信号灯资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)查询性能计数器什么是内存授予?II DBCC MEMORYSTATUS 查询内存对象III DBCC 命令释放多个 SQL Server 内存缓存 - 临时度量值IV 等待资源池 %ls (%ld)中的内存…

【408DS算法题】034进阶-22年真题_判断顺序存储二叉树是否是BST

Index 真题题目分析实现总结 真题题目 已知非空二叉树T的结点值均为正整数&#xff0c;采用顺序存储方式保存&#xff0c;数据结构定义如下: typedef struct { // MAX_STZE为已定义常量int SqBiTNode[MAX_SIZE]; // 保存二叉树结点值的数组int ElemNum; …