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

文章目录

1.创建项目

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

2.websocket介绍

2.1原理介绍

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

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

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

2.2报文格式

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

1) 下面的这个就是我们的websocket的具体的这个报文格式:
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方法重写和整体结构

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

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

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

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

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

3.2依赖注入的改进

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

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

4.前端代码

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

展示:

html 复制代码
<!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服务器被动接收消息

浏览器显示:连接成功

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

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

5.2服务器主动发送消息

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

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

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

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

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

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

相关推荐
技术小齐几秒前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
看,未来1 小时前
Apipost 与 Postman 工具实践指南:WebSocket调试与动态参数测试
websocket·测试工具·postman
shimly1234562 小时前
tcpdump 用法示例
网络·测试工具·tcpdump
xmweisi3 小时前
【华为】报文统计的技术NetStream
运维·服务器·网络·华为认证
VVVVWeiYee3 小时前
BGP配置华为——路径优选验证
运维·网络·华为·信息与通信
yourkin6664 小时前
TCP...
服务器·网络·tcp/ip
哑巴语天雨6 小时前
前端面试-网络协议篇
websocket·网络协议·http·面试·https
绿色果酱6 小时前
利用Postman和Apipost进行WebSocket调试和文档设计
websocket·测试工具·yapi·postman
ktkiko117 小时前
Websocket——心跳检测
网络·websocket·网络协议
GGGGGGGGGGGGGG.8 小时前
hapxory-ACL基础介绍及案例
运维·服务器·网络