在云聊室项目中的前后端中,定义的一套前后端逻辑

embedded/2024/11/25 10:54:30/

1.用户信息

用户在完成登陆后,会获得token和userinfo的会话信息

javascript">// userinfo示范
{"id": null,"openId": "123123736EF541112312312313","nickname": "Deryck","roles": "player","permissions": null,"email": "1398072919@qq.com","password": null,"gender": "男","avatar":"https://www.thederycks.club/static/b24e29d1df3fe59b89b17534eb7d1a38.jpg"
}
// token示范
"token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI5Qjg2MUY3MzZFRjU0MTE3QUQxNjk1RjFBNTA3RkZEOSIsInJvbGVzIjoicGxheWVyIiwibmFtZSI6IkRlcnljayIsImlzcyI6Imh0dHBzOi8vd3d3LnRoZWRlcnlja3MuY2x1Yi8iLCJhdWQiOiJsb2dpbiIsImlhdCI6MTczMTM5NTE5NSwiZXhwIjoxNzMyMjU5MTk1fQ.1qsrwYs4jYhamOyR_Texx3xVNzGZTq4T5DN7avzPpdHi7jHCzgIEwodALocoCCu43veTwk3gdQTWE9_o--DPbA"

2.在云聊室项目中,需要的用户内容

javascript">// 用户个人信息
{"openId": "123123736EF541112312312313","nickname": "Deryck","roles": "player","gender": "男",
}
// 用户的坐标
{"posX": 111,"posY": 222,
}
// 用户的聊天内容
{"chatMsg": "abaaba",
}

3.前后端交互逻辑

前端:

1.与后端建立管道连接,发送连接建立请求:

javascript">this.sendMsgToServer({"code":10001,"tips":"初始化用户信息","openId": null,"data":{"openId": "123123736EF541112312312313","nickname": "Deryck","roles": "player","gender": "男",}
})

2.心跳包

javascript">this.sendMsgToServer({"code":10000,"tips":"心跳","openId":JSON.parse(sessionStorage.getItem('userinfo')).openId,"data":null,
})

3.建立房间

javascript">this.sendMsgToServer({"code":10002,"tips":"创建房间","openId":JSON.parse(sessionStorage.getItem('userinfo')).openId,"data":this.roomName,
})

4.删除房间

javascript">this.sendMsgToServer({"code":10003,"tips": "删除房间","openId":JSON.parse(sessionStorage.getItem('userinfo')).openId,"data":this.roomName,
})

5.加入房间

javascript">this.sendMsgToServer({"code":10004,"tips":"加入房间","openId":JSON.parse(sessionStorage.getItem('userinfo')).openId,"data":room.title,//房间名
})

6.退出房间

javascript">this.sendMsgToServer({"code":10005,"tips":"退出房间","openId":JSON.parse(sessionStorage.getItem('userinfo')).openId,"data":this.roomCode,// 房间凭证
})

7.获取房间列表

javascript">this.sendMsgToServer({"code":10006,"tips":"获取房间列表",//房间凭证"openId":JSON.parse(sessionStorage.getItem('userinfo')).openId,"data":null
})

8.获取指定房间的人员信息

javascript">this.sendMsgToServer({"code":10007,"tips":"获取房间人员信息","openId":JSON.parse(sessionStorage.getItem('userinfo')).openId,"data":roomId
})

9.发送聊天信息

javascript">{
}

后端

后端需要的dto:

1.Player:

java">public class Player {// 唯一标识private String openId;// ctxprivate ChannelHandlerContext ctx;// 玩家昵称private String nickname;// 角色private String roles;// 玩家性别private String gender;// 玩家所在房间private String room_name;// 玩家是否已准备private Boolean is_ready;}

2.Position

      

java">public class Position {private String openId;private Integer posX;private Integer posY;}

3.ChatMsg

java">public class ChatMsg {private String openId;private String msg;
}

4.Room

javascript">public class Room {// 房间idprivate final Integer id;// 房间名private final String room_name;// 最大人数private final Integer max_player_num;}

4.进入房间后的逻辑

ps:在此之前,您的个人信息已经注册进房间通道

两个重要的本地更新函数:

javascript">// 本地新增玩家
local_addPlayer(playerInfo, posX, posY)playerInfo = {uid:,nickname:,gender:,
}// 本地更新玩家位置
local_playerMove(player,targetX, targetY,isMine) 

1.加入房间

javascript">this.sendMsgToServer({"code":10004,"tips":"加入房间","openId":JSON.parse(sessionStorage.getItem('userinfo')).openId,"data":room.title,//房间名
})

2.开启监听

javascript">// 后端返回数据
{"code":10007,"tips":"获取房间内当前人员所有信息","data":[{"openId":,"nickname":,"gender":,"posX":,"posY":,},...]
}
{"code":20001,"tips":"有新玩家进入","data":{"openId":,"nickname":,"gender":,"posX":,"posY":,}
}
{"code":20002,"tips":"房间被删除","data":null,
}
{"code":20003,"tips":"有玩家离开","data":{"openId":,   }
}

3.坐标信息更新

javascript">// 玩家位置信息更新
if (event.data instanceof Blob) {// 坐标信息const reader = new FileReader();reader.onloadend = () => {const arrayBuffer = reader.result;// 使用 MessagePack 解析器将 ArrayBuffer 解析为 JavaScript 对象try {const position = msgpack5().decode(arrayBuffer);// 更新组件数据var index = this.playerUid.indexOf(String(position.openId));this.local_playerMove(this.players[index],position.posX-this.detaX,position.posY,false)} catch (error) {console.error('Error decoding data:', error);}};reader.readAsArrayBuffer(event.data);return;
}


http://www.ppmy.cn/embedded/140359.html

相关文章

【jvm】解释器

目录 1. 说明2. 工作原理3. 特点4. JVM解释器与JIT编译器的关系5. JVM解释器的优化 1. 说明 1.JVM(Java虚拟机)解释器是JVM的一个重要组成部分,负责将Java字节码指令翻译并执行为本地机器码。 2. 工作原理 1.读取字节码指令:JV…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹,用来存放SDK包(其实本质就是路径要对就ok了),右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取,如下所示:&#xff0…

Spring 框架环境搭建

一、新建 Maven 项⽬ 1.创建 Maven 的普通 Java 项⽬ 2. 设置项⽬的坐标 3.设置项⽬的 Maven 环境 4、设置项⽬的名称和存放的⼯作空间 二、调整项⽬环境 1. 修改 JDK 版本 2.改单元测试 JUnit 版本 3.build标签中的pluginManagement标签 三、添加 Spring 框架的依赖坐标 …

WPF——自定义ToolTip

问题 前一天制作的图标按钮,在测试的过程中发现一个问题:为图标按钮添加的提示如下图所示,它的显示效果非常差,甚至不能看清文本内容,并且其字体与颜色也不是愚所希望的。 产生原因 此是由于tooltip有一个默认的样式…

信号控制技巧

信号控制技巧 • 检查是否真正需要全局复位。 • 避免异步控制信号。 • 保持时钟、使能和复位信号极性一致。 • 勿将置位和复位编码到同一寄存器元件中。 • 如果确实需要异步复位,应务必与异步复位的解除保持同步。 掌握推断的结果 您的代码最终必须映…

阿里云VLDB顶会论文在Async-fork在redis中应用解读

1.背景 该论文主要是解决redis在持久化(RDB,AOD)以及主从全量同步时都会调用fork来创建子进程获取内存快照,由于fork需要复制父进程页表,此时如果内存比较大,也就是我们常说的大key过多,就会导…

一次成功尝试:旧电脑通过网线,连接带无线网卡电脑上外网

一 引言 最近,为一台旧电脑安装了ubuntu系统,需要连网安装一些软件。 但是电脑太旧了,也没有无线网卡,怎么办呢? 手头还有另外一台笔记本电脑,带无线网卡,于是,想尝试通过笔记本电…

游戏引擎学习第22天

移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…