[网页五子棋]项目介绍以及websocket的消息推送(轮询操作)、报文格式和握手过程(建立连接过程)

文章目录

  • 项目背景
  • 核心技术
  • 创建项目
  • WebSocket
    • 消息推送
      • 轮询操作
    • 报文格式
    • 握手过程(建立连接过程)

项目背景

  • 用户模块
    1. 用户的注册和登录
    2. 管理用户的天梯分数,比赛场数,获胜场数等信息
  • 匹配模块
    • 依据用户的天梯积分,来实现匹配机制
  • 对战模块
    • 把两个匹配到的玩家,放到一个游戏房间中,双方通过网页的形式来进行对战比赛

核心技术

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

创建项目

相关依赖image.png|309

WebSocket

消息推送

我们之前学习的服务器开发,主要是这样的模型:

  • 客户端主动向服务器发起请求,服务器收到之后,返回一个响应
  • 如果客户端不主动发起请求,服务器是不能主动联系客户端的

我们是否需要,服务器主动给客户端发送消息这样的场景呢?

  • 需要。——消息推送

image.png

  • 当玩家 1 在棋盘上落子的时候,玩家 1 的客户端就需要给服务器发一个消息,告诉服务器这个玩家把棋子落在哪个位置了
  • 玩家 2 也就需要及时地获取到玩家 1 的落子信息
  • qq、微信、五子棋…

轮询操作

当前已有的知识,主要是 HTTP。但 HTTP 自身是难以实现这种消息推送效果的

  • HTTP 要想实现类似的效果,就需要基于“轮询”的机制

image.png

  • 玩家 1 在思考中,尚未落子
  • 玩家 2,每隔一段时间(每隔 1s500ms…),就主动地给服务器发起一个请求,问看看当前玩家 1 落子了没有

很明显,像这样的轮询操作,开销是比较大的,成本也是比较高的

  • 如果轮询间隔时间长,玩家 1 落子之后,玩家 2 就不能及时拿到结果
  • 如果轮询间隔时间短,虽然即时性得到改善,但是玩家 2 不得不浪费更多的机器资源(尤其是带宽)

这就类似于去餐馆吃饭

  1. 每隔 1 分钟,就去前台看一眼,问问老板,我的饭好了没——轮询
  2. 我直接找个角落坐下来,玩手机,啥时候饭做好了,老板就端过来了——消息推送

因此,websocket 就是实现消息推送的一个主要的方式

报文格式

Websocket 也是一个应用层协议,下层是基于 TCPimage.png- FIN:代表当前是不是一个结束报文

  • RSV:保留位,可能以后有什么用,但现在还没任何用处
  • opcode:描述了当前这个 websocket 报文是什么类型
    • 表示当前这是一个文本帧,还是一个二进制帧
    • 表示当前这是一个 ping 帧,还是一个 pong 帧(发 pingpong)
  • Payload len:表示当前数据包携带的数据载荷长度
    • 这个字段本身就是一个变长的,一个 websocket 数据报能承载的载荷长度是非常非常长的
  • Payload Data:实际报文要传输的数据载荷

握手过程(建立连接过程)

使用一个网页端,尝试和服务器建立 websocket 连接

  • 网页端会先给服务器发起一个 HTTP 请求,这个 HTTP 请求中会带有特殊的 header,比如:
    • Connection: Upgrade
    • Upgrade: Websocket
    • 这两个 header 其实就是在告知服务器,我们要进行协议升级。如果服务器支持 websocket,就会返回一个特殊的 HTTP 响应,这个响应的状态码是 101(切换协议)
  • 客户端和服务器之间就开始使用 websocket 进行通信了

这个过程就类似于:

  • 你跟外国人进行对话,你说:can you speak chinese?
  • 对面说:yes
  • 然后你们就开始用中文进行交流了

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

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

相关文章

时序模型介绍

一.整体介绍 1.单变量 vs 多变量时序数据 单变量就是只根据时间预测,多变量还要考虑用户 2.为什么不能用机器学习预测: a.时间不是影响标签的关键因素 b.时间与标签之间的联系过于弱/过于复杂,因此时序模型依赖于时间与时间的相关性来进行预…

尚硅谷redis7 86 redis集群分片之3主3从集群搭建

86 redis集群分片之3主集群搭建 3主3从redis集群配置 找3台真实虚拟机,各自新建 mķdir -p /myredis/cluster 新建6个独立的redis实例服务 IP:192.168.111.175端口6381/端口6382 vim /myredis/cluster/redisCluster6381.conf bind 0.0.0.0 daemonize yes protected-mode no …

Python服务器请求转发服务

前言: 服务器无法连接外网 配置步骤 准备python脚本服务器内下载python 示例 1.下载python创建虚拟环境以及配置 -- 磁盘空间 df -h -- 下载apt sudo yum install apt -y-- 下载python pip sudo apt install python3 python3-pip python3-venv -y-- 测试查看 …

02.K8S核心概念

服务的分类 有状态服务:会对本地环境产生依赖,例如需要把数据存储到本地磁盘,如mysql、redis; 无状态服务:不会对本地环境产生任何依赖,例如不会存储数据到本地磁盘,如nginx、apache&#xff…

Java八股-Java优缺点,跨平台,jdk、jre、jvm关系,解释和编译

java优势劣势? 优势:面向对象,平台无关,垃圾回收,强大的生态系统 劣势:运行速度慢(相比于c和rust这样的原生编译语言会比较慢),语法繁琐(相比于python&…

Attention Is All You Need论文阅读笔记

Attention is All You Need是如今机器学习研究者必读的论文,该文章提出的Transformer架构是如今很多机器学习项目的基础,说该文章极大推动了机器学习领域的研究也不为过。 但这么重要,也是必读的文章对初学者来说其实并不友好,很多…

【MAC】YOLOv8/11/12 转换为 CoreML 格式并实现实时目标检测

在本文中,我们将详细介绍如何将 YOLOv8/11/12 模型转换为 CoreML 格式,并使用该模型在摄像头实时检测中进行目标检测。主要适用于M1、M2、M3、M4芯片的产品。 以下教程在YOLOv8/11/12均适用,此处就以 YOLOv11 举例 目录 前提条件YOLOv8/11/12 转换为 CoreML实时目标检测结论…

Redis--缓存击穿详解及解决方案

缓存击穿 缓存击穿问题也称热点key问题,就是一个高并发访问(该key访问频率高,访问次数多)并且缓存重建业务比较复杂的key突然失效了,大量的请求访问会在瞬间给数据库带来巨大的冲击。 缓存重建业务比较复杂&#xff…

UniApp X:鸿蒙原生开发的机会与DCloud的崛起之路·优雅草卓伊凡

UniApp X:鸿蒙原生开发的机会与DCloud的崛起之路优雅草卓伊凡 有句话至少先说,混开框架中目前uniapp x是率先支持了鸿蒙next的开发的,这点来说 先进了很多,也懂得审时度势。 一、UniApp X如何支持鸿蒙原生应用? UniAp…

域名解析怎么查询?有哪些域名解析查询方式?

在互联网的世界里,域名就像是我们日常生活中的门牌号,帮助我们快速定位到想要访问的网站。而域名解析则是将这个易记的域名转换为计算机能够识别的IP地址的关键过程。当我们想要了解一个网站的域名解析情况,或者排查网络问题时,掌…

算力卡上部署OCR文本识别服务与测试

使用modelscope上的图像文本行检测和文本识别模型进行本地部署并转为API服务。 本地部署时把代码中的检测和识别模型路径改为本地模型的路径。 关于模型和代码原理可以参见modelscope上这两个模型相关的页面: iic/cv_resnet18_ocr-detection-db-line-level_damo iic…

大语言模型的完整训练周期从0到1的体系化拆解

以下部分内容参考了AI。 要真正理解大语言模型(LLM)的创生过程,我们需要将其拆解为一个完整的生命周期,每个阶段的关键技术相互关联,共同支撑最终模型的涌现能力。以下是体系化的训练流程框架: 阶段一&am…

吃水果(贪心)

文章目录 题目描述输入格式输出格式样例输入样例输出提交链接提示 解析参考代码 题目描述 最近米咔买了 n n n 个苹果和 m m m 个香蕉,他每天可以选择吃掉一个苹果和一个香蕉(必须都吃一个,即如果其中一种水果的数量为 0 0 0,则…

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(4)

1.问题描述: LoginWithHuaweiIDButton不支持深色模式下定制文字和loading样式? 解决方案: LoginWithHuaweiIDButtonParams 中的有个supportDarkMode属性,设置为true后,需要自行响应系统的变化,见文档&am…

【C语言】指针详解(接)

前言: 文接上章,在上章节讲解了部分指针知识点,在本章节为大家继续提供。 六指针与字符串:C 语言字符串的本质 在 C 语言中,字符串实际上是一个以\0结尾的字符数组。字符串常量本质上是指向字符数组首元素的指针&…

第5讲、Odoo 18 CLI 模块源码全解读

Odoo 作为一款强大的企业级开源 ERP 系统,其命令行工具(CLI)为开发者和运维人员提供了极大的便利。Odoo 18 的 odoo/cli 目录,正是这些命令行工具的核心实现地。本文将结合源码,详细解读每个 CLI 文件的功能与实现机制…

如何将 PDF 文件中的文本提取为 YAML(教程)

这篇博客文章将向你展示如何将 PDF 转换为 YAML,通过提取带有结构标签的标记内容来实现。 什么是结构化 PDF? 一些 PDF 文件包含结构化内容,也称为带标签(tagged)或标记内容(marked content)&…

银发团扎堆本地游,“微度假”模式如何盘活银发旅游市场?

​ 银发微度假,席卷江浙沪 作者 | AgeClub吕娆炜 前言 均价200-300元的两天一夜微度假产品,正在中老年客群中走红。 “我们属于酒店直营,没有中间商赚差价,老年人乘坐地铁到目的地站,会有大巴负责接送,半…

苹果iOS应用ipa文件进行签名后无法连接网络,我们该怎么解决

苹果iOS应用ipa文件在经过签名处理后,如果发现无法连接网络,这可能会给用户带来极大的不便。为了解决这一问题,可以采取一系列的排查和解决步骤,以确保应用能够顺利地访问互联网。 首先,确保你的设备已经连接到一个稳…

MySQL 中 ROW_NUMBER() 函数详解

MySQL 中 ROW_NUMBER() 函数详解 ROW_NUMBER() 是 SQL 窗口函数中的一种,用于为查询结果集中的每一行分配一个​​唯一的连续序号​​。与 RANK() 和 DENSE_RANK() 不同,ROW_NUMBER() 不会处理重复值,即使排序字段值相同,也会严格…