当前位置: 首页 > article >正文

网页端五子棋对战(一)---websocket引入前后端交互的实现

文章目录

  • 1.创建项目
  • 2.websocket介绍
    • 2.1原理介绍
    • 2.2报文格式
    • 2.3websocket建立连接的过程(握手)
  • 3.服务器端案例
    • 3.1方法重写和整体结构
    • 3.2依赖注入的改进
  • 4.前端代码
  • 5.浏览器验证前后端交互
    • 5.1服务器被动接收消息
    • 5.2服务器主动发送消息

1.创建项目

其实这个项目的创建过程中,和我们之前没有太大的这个区别,例如这个web和mybatis相关的这个框架我们之前都是经常使用的,唯一需要注意的就是这个websocket,这个我们后面会进行这个具体的说明;

image-20241130154129371

2.websocket介绍

2.1原理介绍

这个websocket就是一种消息的推送的机制:

1)原本的这个http请求只能是我们的这个客户端去访问我们的这个服务器,但是我们的服务器无法主动去告诉我们的客户端相关的信息,这个就是每一次都需要我们的客户端去询问“对方落棋子了没有”;

2)websocket就是为了解决这个问题:让我们的这个服务器可以主动告诉客户端,这个时候客户端也是可以自己主动询问的,两个都可以,这样就可以提高我们的这个效率;

image-20241130154938628

2.2报文格式

websocket就是一个应用层的协议:是在这个http协议的这个基础上面进行改进之后产生的这个协议;

1)下面的这个就是我们的websocket的具体的这个报文格式:
image-20241130155452472
2)opcode表示的就是这个websocket里面的报文的具体的类型;
例如是文本帧还是二进制帧
是一个ping帧,还是pong帧,这个就是心跳报的机制,pingpong的这个交互让我们知道这个通信是正常的;
3)payloadlen:数据包携带的这个数据载荷的长度(变长格式);
4)payload data就是实际传输的这个报文的载荷;

2.3websocket建立连接的过程(握手)

建立连接的过程就是握手的这个过程:

1)我们使用这个网页端,尝试和这个服务器之间建立这个链接;

2)网页端会先进行合格请求的发送,发送给我们的这个服务器http请求,这个http请求里面有这个特殊header;

3)这个特殊的header就是诸如这个:

connection:upgrade;

upgrade:websocket之类的,就说我们要升级这个协议的类型到这个websocket;

4)这个时候我们的服务器收到这个消息之后,如果同意就会进行这个http响应,这个响应很特殊,是我们的的101状态码,表示我们开始更换的这个协议;

5)接下来的这个服务器端和这个客户端就是用这个websocket进行通信;

3.服务器端案例

3.1方法重写和整体结构

我们定义一个类,对于下面的四个方法进行重写:

image-20241130160738273

上面的这个方法就是我们的这个新建的类继承的这个父类的方法,我们直接点击这个generate是可以看到上面的这些方法的,然后我们选择上面的这四个方法进行重写即可;

主要就是我们的这个服务器端和我们的客户端进行交互的这个过程:建立联集合断开连接,收到消息和出现异常的情况(这些就是可能会出现的这个情况);

image-20241130162130414

上面的这个代码无法让我们的sprin感知到,这个时候我们需要新建文件:就是我们新建这个config包包,这个包里面这个文件就是用来进行说明:让spring意识到,这个是配置websocket的类;

我们的这个方法里面的第一个参数就是我们的上一个类的对象,第二个参数就是我们的路径(当用户访问到这个路径的时候,就会触发前面的这个对象,调用这个对象里面的相关的方法);

image-20241130163122011

3.2依赖注入的改进

为了凸显这个spring的依赖注入,控制反转的这个性能,我们可以使用另外一个方式创建我们的对象:

就是在这个类加上注解component,然后在这个配置类里面使用@autowired进行这个依赖的注入;

image-20241130163621445

4.前端代码

image-20241201192008073

需要注意的就是这个对应关系:前端代码的第13行里面的路径需要和我们的后端代码addHandler里面的这个第二个参数是一致的,否则是无法进行正常的通信的;

image-20241201192508909

展示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="text" id="message">
    <buttom id="submit">提交</buttom>

    <script>
        //1.创建websocket实例
        let websocket = new WebSocket("ws://127.0.0.1:8080/test")
        //2.挂载回调函数
        websocket.onopen = function(){
            console.log("连接成功");
        }
        websocket.onmessage = function(e){
            console.log("收到消息:"+e.data);
        }
        websocket.onerror = function(){
            console.log("连接异常");
        }
        websocket.onclose = function(){
            console.log("连接关闭");
        }
        //3.实现点击之后,通过我们的这个websocket发送请求
        let input = document.querySelector('#message');
        let button = document.querySelector('#submit');
        button.onclick = function(){
            console.log("发送消息:"+input.value);
            websocket.send(input.value);
        }

    </script>
</body>
</html>

5.浏览器验证前后端交互

5.1服务器被动接收消息

浏览器显示:连接成功

image-20241130172857715

IDEA服务端显示效果:我们的服务器端接受到了来自于这个浏览器的消息

image-20241130172939511

当我们把这个浏览器关闭之后:我们的客户端和服务器就会自动断开这个链接,并且打印这个对应的日志信息;

image-20241130173055883

5.2服务器主动发送消息

我们上面已经介绍了这个websocket的相关机制,因此我们可以在原有的这个代码的基础上面进行改进,就是让我们的这个服务器不是被动的接收消息,而是可以发送消息;

我们的做法就是,我们通过浏览器向这个服务器发送数据的时候,我们的服务端把这个接受的数据原封不动的返回给我们的客户端;

修改的地方就是使用下面的这个websocket里面的这个session会话的sendmessage方法发送消息,返回给我们的客户端;

动的接收消息,而是可以发送消息;

我们的做法就是,我们通过浏览器向这个服务器发送数据的时候,我们的服务端把这个接受的数据原封不动的返回给我们的客户端;

修改的地方就是使用下面的这个websocket里面的这个session会话的sendmessage方法发送消息,返回给我们的客户端;

image-20241130173309888


http://www.kler.cn/a/419736.html

相关文章:

  • qt QGraphicsScale详解
  • Centos7安装MySQL8.0详细教程(压缩包安装方式)
  • [node.js] [HTTP/S] 实现 requests 发起 HTTP/S/1.1/2.0 请求
  • linux 获取公网流量 tcpdump + python + C++
  • GoReplay开源工具使用教程
  • Linux-虚拟环境
  • LangGPT社区创始人云中江树:用热爱与坚持点燃实战营课堂
  • 物理机上的Navicat连接不上centos7虚拟机中mysql的解决办法
  • C++_详解多态
  • Base64.cv:高效安全的在线Base64转换工具详解
  • 高效集成:将聚水潭数据导入MySQL的实战案例
  • PostgreSQL17.x创建用户与授权命令
  • 具身智能高校实训解决方案——从AI大模型+机器人到通用具身智能
  • Oracle DataGuard 主备正常切换 (Switchover)
  • 《沉积与特提斯地质》
  • PD虚拟机启动Windows系统突然黑屏的解决方法
  • 小程序-基于java+SpringBoot+Vue的养老院管理系统设计与实现
  • 【datasheet】LTC4412 (2)
  • 阿里重磅开源 Fluss: Flink Unified Streaming Storage
  • 宠物领养网络:SpringBoot的实现之道
  • Android studio 签名加固后的apk文件
  • YOLOv1 (You Only Look Once)
  • 如何使用 Jenkins 集成 Docker 以实现自动化 CI/CD 流程
  • 递归1——递归入门
  • 计算机网络复习2——物理层
  • C++多线程——原子操作(atomic)