五子棋双人对战项目(1)——WebSocket介绍

目录

一、项目介绍

如何实现实时同步对局?

二、WebSocket

1、什么是WebSocket?

2、WebSocket的报文格式

opcode

payload len

payload data

3、WebSocket握手过程

4、WebSocket代码的简单编写

三、WebSocket 和 HTTP的关系

1、相同点:

2、不同点

3、联系


一、项目介绍

        五子棋双人对战项目一个Web项目,支持多个玩家联网匹配对局,主要有以下三个模块:

1、用户模块

用户的注册和登录。

管理用户的天梯分数、比赛场数、获胜场数。

2、匹配模块

依据用户的天梯积分,实现匹配机制。

3、对战模块

把两个匹配到的玩家放到一个游戏房间中。双方通过网页的形式进行对战。

关键技术:

Java,Spring/Spring Boot/Spring MVC,HTML/CSS/JS/AJAX,MySQL/MyBatis,WebSocket

如何实现实时同步对局?

        之前学习的服务器开发,主要使用的是下面这样的模型:

客户端:主动向服务器发起请求,服务器收到之后,返回一个响应。如果客户端不向服务器发送请求,服务器就不会给客户端返回响应。

        五子棋项目是要实现实时同步对局的,也就是对方落子后,我这边立马能更新棋盘,我落子后,对方也要能立即更新棋盘。

        基于之前学过的HTTP协议,如果我不向服务器发起请求,拿到最新棋盘数据,那么我这里的页面就一直不会改变。

        基于上面的问题,想到有以下2种解决方案:

1、客户端每隔一段时间向服务器发起请求,拿到最新的数据。

2、服务器主动给我们返回响应。

        第一个方案明显不行,如果间隔时间太短,发送请求的频率会非常高,也就意味着会浪费带宽,浪费资源;间隔时间太长,就可能导致对方已经落子了,但还在间隔时间中,那么我就要继续等客户端发起请求才能拿到最新的数据,明显也不合理。

        第二个方案可行,如果对方落子了,服务器接收到请求,主动给我返回响应,这很就合理了。

        服务器主动发送响应给客户端,这样的场景称之为:消息推送。

        那HTTP协议是否能实现 “消息推送” 场景呢?HTTP自身是难以实现这种消息推送效果的。如果要想实现这样的效果,就需要基于 “轮询” 的机制。而所谓的 “轮询” ,也就是上面的第一种方案,明显是不合理的,会白白浪费很多机器资源(尤其是带宽)。

        但有一种协议可以很轻松的实现轮询:WebSocket。


二、WebSocket

1、什么是WebSocket?

1、WebSocket 是HTML5下一种新的协议(WebSocket协议本质上是一个基于TCP的协议)

2、它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽,同时可以达到实时通讯的目的。

3、WebSocket是一个持久化的协议。

2、WebSocket的报文格式

opcode

描述了当前这个WebSocket报文是啥类型。比如:

表示当前这是一个文本帧,还是一个二进制;

表示当前这是一个 ping 帧,还是一个 pong 帧。

payload len

表示当前数据报携带的数据载荷长度。

这个字段本身就是一个变长的,一个WebSocket数据报能承载的载荷长度是非常长的。

payload data

实际报文要传输的数据载荷。

3、WebSocket握手过程

        使用网页端,尝试和服务器建立 WebSocket 连接,网页端会先给服务器发起一个 HTTP 请求,这个 HTTP 请求中会带有特殊的 header:

        ConnectionUpgrade

        UpgradeWebSocket

        如果服务器支持 WebSocket,就会返回一个特殊的 HTTP 响应。这个响应的状态码是 101(切换协议)。

        然后客户端和服务器之间就可以开始使用 WebSocket 来进行通信了。

4、WebSocket代码的简单编写

        后端代码:

@Component
public class TestWebSocket extends TextWebSocketHandler {@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {System.out.println("建立连接");}@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {System.out.println("收到信息: " + message.getPayload());}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {System.out.println("出现异常");}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {System.out.println("关闭连接");}
}

        指定路径:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Autowiredprivate TestWebSocket testWebSocket = new TestWebSocket();@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(testWebSocket, "/test");}
}

        前端代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>TestWebSocket</title>
</head>
<body><input type="text" id="message"><button id="submit">提交</button><script>//创建websocket实例var websocket = new WebSocket("ws://127.0.0.1:8080/test");//需要挂载一些实例websocket.onopen = function() {console.log("连接建立");}websocket.onmessage = function(e) {console.log("接收消息: " + e.data);}websocket.onerror = function() {console.log("连接异常");}websocket.onclose = function() {console.log("连接关闭");}//实现点击按钮后,通过WebSocket发送请求var input = document.querySelector("#message");var button = document.querySelector("#submit");button.onclick = function() {console.log("发送信息: " + input.value);websocket.send(input.value);}
</script>
</body>
</html>

        运行程序:

        

        连接成功后,前端、后端都打印建立连接

        输入信息,点击提交

        关闭浏览器,后端打印

        这就是简单的WebSocket通信过程。


三、WebSocket 和 HTTP的关系

1、相同点:

1、都基于 TCP,都是可靠性传输协议。

2、都是应用层协议。

2、不同点

1、WebSocket 是双向通信协议,模拟Socket协议,可以双向发送或接收信息。

2、HTTP 是单向的。

3、WebSocket 是需要浏览器和服务器握手进行建立连接的。

4、HTTP是浏览器向服务器发起请求,从而建立连接,服务器预先并不知道这个连接。

3、联系

WebSocket在建立握手时,数据是通过HTTP传输的。但是建立连接成功后,真正传输时是不需要HTTP协议的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习案列】基于随机森林和xgboost的二手车价格回归预测

一、项目分析 1.1 项目任务 kaggle二手车价格回归预测项目&#xff0c;目的根据各种属性预测二手车的价格。 1.2 评估准则 评估的标准是均方根误差&#xff1a; 1.3 数据介绍 数据连接https://www.kaggle.com/competitions/playground-series-s4e9/data?selecttrain.csv 其…

Linux相关概念和重要知识点(8)(操作系统、进程的概念)

1.操作系统&#xff08;OS&#xff09; &#xff08;1&#xff09;基本结构的认识 任何计算机系统都包含一个基本的程序集合&#xff0c;用于实现计算机最基本最底层的操作&#xff0c;这个软件称为操作系统。操作系统大部分使用C语言编写&#xff0c;少量使用汇编语言。 从…

即插即用篇 | YOLOv8 引入单头视觉Transformer模块 | CVPR 2024

本改进已同步到YOLO-Magic框架! 最近,高效的视觉Transformer在资源受限的设备上以低延迟表现出了出色的性能。传统上,它们在宏观层面上采用44的Patch嵌入和四阶段结构,而在微观层面上使用多头配置的复杂注意力机制。本文旨在通过内存高效的方式解决各个设计层面的计算冗余问…

[ IDE ] SEGGER Embedded Studio for RISC-V

一、FILE 二、Edit 三、View 四、Search 五、Navigate 六、Project 七、Build 7.1 编译 先选择一个目标类型&#xff0c;再选择编译。 八、Debug​​​​​​​ 九、Target 9.1 烧录代码 十、Tools 10.1 自定义快捷键 点击菜单项&#xff0c;通过Tools –> Options –&g…

软考中级网络工程师选择题

部分参考 软考中级网络工程师全面学习笔记第2版(5万字)配套视频及课件_软考中级网络工程师资料-CSDN博客 1.计算机网络概述 OSI七层模型&#xff1a;物联网淑慧试用 TCP/IP&#xff1a;网网&#xff08;网际层&#xff09;传应 高频考点&#xff1a; 中央处理器CPU 固态硬盘…

【rabbitmq-server】安装使用介绍

在 1050a 系统下安装 rabbitmq-server 服务以及基本配置;【注】:改方案用于A版统信服务器操作系统 文章目录 功能概述功能介绍一、安装软件包二、启动服务三、验证四、基本配置功能概述 RabbitMQ 是AMQP的实现,高性能的企业消息的新标准。RabbitMQ服务器是一个强大和可扩展…

【Oauth2整合gateway网关实现微服务单点登录】

文章目录 一.什么是单点登录&#xff1f;二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录&#xff1f; 单点登录&#xff08;Single Sign On&…

鸿蒙界面开发(九):列表布局 (List)

列表布局 当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、音乐列表、购物清单等&#xf…

ArcGIS Desktop使用入门(三)常用工具条——拓扑(下篇:地理数据库拓扑)

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

Labview helper

IMAQ Advanced Setup Learn Geometric Pattern 2 VI 参数说明Curve Extraction Mode (0)指定VI如何识别图像中的曲线。如果您希望VI不对图像中对象的均匀性或图像背景做出任何假设&#xff0c;请将此选项设置为正常。如果您希望VI假定图像中的对象或图像背景由均匀的像素值组成…

【JVM】一篇文章彻底理解JVM的组成,各组件的底层实现逻辑

文章目录 JVM 的主要组成部分类加载器&#xff08;Class Loader&#xff09;1. 加载&#xff08;Loading&#xff09;2. 链接&#xff08;Linking&#xff09;3. 初始化&#xff08;Initialization&#xff09; Execution Engine&#xff08;执行引擎&#xff09;1. 解释器&…

QT开发:详解 Qt 多线程编程核心类 QThread:基本概念与使用方法

1. 引言 在现代应用程序开发中&#xff0c;多线程编程是一个关键技术&#xff0c;能够显著提高程序的效率和响应速度。Qt 是一个跨平台的 C 框架&#xff0c;其中 QThread 类是实现多线程编程的核心类。本文将深入详解 QThread 的基本概念、使用方法及其在实际应用中的重要性。…

对于 Vue CLI 项目如何引入Echarts以及动态获取数据

&#x1f680;个人主页&#xff1a;一颗小谷粒 &#x1f680;所属专栏&#xff1a;Web前端开发 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、数据画卷—Echarts介绍 1.1 什么是Echarts&#xff1f; 1.2 Echarts官网地址 2、Vue CLI 项目…

第十三周:机器学习笔记

第十三周周报 摘要Abstract一、机器学习——Transformer&#xff08;上&#xff09;1. Sequence to Sequence(Seq 2 Seq&#xff0c;序列到序列模型) 的应用2. Transformer的结构2.1 Transformer encoder&#xff08;Transformer 编码器&#xff09; 二、Pytorch学习1. 网络模型…

将图片资源保存到服务器的盘符中

服务类 系统盘符&#xff1a;file-path.disk&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;文件根路径&#xff1a;file-path.root-path&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;http协议的Nginx的映射前缀&#xff1a;PrefixConstant.…

go解决引入私有包报错“Repository owner does not exist“的两种方式

当你写好引入的私有包,执行go mod tidy报错: Gogs: Repository owner does not exist fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 目前我的两种解决方案: 一、拉群整个…

freeRDP OPenssl

libusb需要下载 我使用的是VS2019编译 所以需要include 与vs2019 在cmake里面修改路径 C:/Users/JPM/source/repos/freeRDP/FreeRDP-stable-2.0/libusb-1.0.24/include/libusb-1.0 C:/Users/JPM/source/repos/freeRDP/FreeRDP-stable-2.0/libusb-1.0.24/VS2019/MS64/static/l…

模形式与态、势、感、知

模形式是数学中一个重要的研究领域&#xff0c;主要出现在数论、代数几何和表示论等多个学科中。模形式可以视为在某种意义上具有“对称性”的函数&#xff0c;这些函数在特定的条件下满足一定的变换性质。具体来说&#xff0c;模形式是定义在上半平面上的复值函数&#xff0c;…

第九节 Opencv自带颜色表操作

知识点&#xff1a;Look Up lTable&#xff08;LUT&#xff09;查找表 了解LUT查找表的作用与用法&#xff0c;代码实现与API介绍 -applyColorMap&#xff08;src,dst,COLORMAP&#xff09; -src表示输入图像 -dst表示输出图像 匹配到的颜色LUT&#xff0c;Opencv支持13种…

TDOA方法求二维坐标的MATLAB代码演示与讲解

引言 时间差定位(Time Difference of Arrival, TDOA)是一种用于确定信号源位置的技术,广泛应用于无线通信、声学定位等领域。通过测量信号到达多个接收器的时间差,可以计算出信号源的二维坐标。本文将通过MATLAB代码演示如何使用TDOA方法来求解二维坐标。 TDOA原理 TDOA…