unity学习(25)——客户端与服务器合力完成注册功能(7)逻辑流程彻底解决

在服务器LoginHandler类中:

public void login(Session session, SocketModel model)
{LoginDTO loginDto = Coding<LoginDTO>.decode(model.Message);//MyLog.form.textAdd("用户申请登录" + loginDto.userName + "      " + loginDto.passWord);Console.WriteLine(("用户申请登录" + loginDto.userName + "      " + loginDto.passWord));string v = BizUtil.account.login(loginDto.userName, loginDto.passWord, session);session.write(0, 0, 1, (object) new StringDTO(v));
}

BizUtil.account.login,就认为是把账号密码存入数据库就行了,其实是一个“字典+文件”。

session.write(0, 0, 1, (object) new StringDTO(v));是写客户端发送数据包,数据包的message表示是否注册成功。

此时,结合(24)中所总结的结构。客户端在NetWorkScript中,先通过ReceiveCallBack将收到的数据,收到的数据表写到System.Buffer中,Buffer的定义如下:

namespace System
{public static class Buffer{public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count);public static int ByteLength(Array array);public static byte GetByte(Array array, int index);[CLSCompliant(false)]public static void MemoryCopy(void* source, void* destination, long destinationSizeInBytes, long sourceBytesToCopy);[CLSCompliant(false)]public static void MemoryCopy(void* source, void* destination, ulong destinationSizeInBytes, ulong sourceBytesToCopy);public static void SetByte(Array array, int index, byte value);}
}

然后是MessageManager利用机制不停调用UpDate,UpDate不断读取 利用 删除第一条消息。

利用是使用OnMessage函数利用的是服务器内部的消息,问题很明显了,就是加入Buffer的没有转换成消息

 OnMessage所处理的消息在,List<SocketModel> list = NetWorkScript.getInstance().getList();

去NetWorkScript中,队列定义如下:

private static List<SocketModel> messageList = new List<SocketModel>();

很明显这是个网络包队列,唯一的增加队列元素的方法如下:

private void readMessage(byte[] message)//处理所收到的信息
{MemoryStream ms = new MemoryStream(message, 0, message.Length);ByteArray ba = new ByteArray(ms);//这个模型是自定义的SocketModel model = new SocketModel();model.type = ba.ReadInt();model.area = ba.ReadInt();model.command = ba.ReadInt();int length= ba.ReadInt();if (length>0){model.message = ba.ReadUTFBytes((uint)length);}messageList.Add(model);//这个函数也是自定义的Debug.Log("readMessage并加入消息队列");
}

但现在我 客户端已有的代码中没有调用readMessage,估计是我前面的学习遗漏了,和源代码对比一下。明确到目前为止,客户端只有这一个List,也就是说无论游戏内部的消息,还是服务器发来的数据包,都应该写到这个List中

原代码的NetWorkScript中果然有readMessage的调用,是我之前漏了

修改后的代码如下!

private static void ReceiveCallBack( IAsyncResult ar)//回调方法 
{try{int readCount = 0;readCount = socket.EndReceive(ar);//ar其实就是传进来的内容byte[] temp = new byte[readCount];Buffer.BlockCopy(buff, 0, temp, 0, readCount);//从buff到tempaddMessage(temp);//将收到的包 加入 List!Debug.Log("小丑到底是谁:"+readCount);Debug.Log("ReceiveCallBack里的buff:" + BitConverter.ToString(buff));//再多新建一个}catch {socket.Close();Debug.Log("net error");}socket.BeginReceive(buff, 0, 1024, SocketFlags.None, ReceiveCallBack, buff);//形成闭环
}
private static void addMessage(byte[] message)//处理所收到的信息
{MemoryStream ms = new MemoryStream(message, 0, message.Length);ByteArray ba = new ByteArray(ms);//这个模型是自定义的SocketModel model = new SocketModel();model.type = ba.ReadInt();model.area = ba.ReadInt();model.command = ba.ReadInt();int length= ba.ReadInt();if (length>0){model.message = ba.ReadUTFBytes((uint)length);}messageList.Add(model);//这个函数也是自定义的Debug.Log("readMessage将服务器发来的包,加入List");
}

测试发现,还有一些小问题!

增加输出MessagerManger所收到的内容,一下内容是点击panel中”确定“按钮后自产自销的内容。

紧接着的List内容应该是服务器所返回数据包的内容:

返回的数据包有错,应该是编码问题!

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

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

相关文章

2024/2/18 图论 最短路入门 floyd 1

目录 Floyd求最短路 854. Floyd求最短路 - AcWing题库 模板】Floyd B3647 【模板】Floyd - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Floyd求最短路 854. Floyd求最短路 - AcWing题库 思路&#xff1a;在代码里面 完整代码&#xff1a; #include <bits/stdc.h&g…

Quartz---JobDataMap使用的两种方式

任务调度执行原理图&#xff1a; JobDataMap的使用 JobDataMap是Quartz调度器中的一个重要组件&#xff0c;主要用于存储和传递与作业&#xff08;Job&#xff09;相关的数据。它是一个实现了Java Map接口的对象&#xff0c;可以用来保存一系列的序列化的对象。这些对象在作业执…

Langchain的提示词模板

因为做AI项目的过程中&#xff0c;需要处理各种提示词&#xff08;prompt&#xff09;&#xff0c;其中有些是固定的文本&#xff0c;有些是会反复修改的。如果是简单的提示词&#xff0c;直接用python里面的字符串format()或者replace()函数进行处理即可。对于复杂的&#xff…

强大的蓝牙工具Ubertooth系列

Ubertooth One 是一个开源的蓝牙嗅探设备&#xff0c;它提供了多个软件工具来进行蓝牙通信的分析、监视和探测。以下是 Ubertooth One 的一系列软件工具的介绍&#xff1a; Ubertooth&#xff1a;Ubertooth 是 Ubertooth One 的核心驱动程序和硬件抽象层。它允许与 Ubertooth O…

Oracle大型数据库技术

实验环境 sqlplus 记录实验过程的方法&#xff1a; spool 带有绝对路径的文件名 [append] --SQL语句 spool off开启相关服务 oracleserviceORCL 控制面板–管理–服务–找到后开启命令行方法&#xff1a; cmd–net start|stop oracleserviceorcl 常用操作 显示当前用户名 sho…

IPv4编址方式

IPv4编址方式 本文的知识都可以到B站up湖科大教书匠的视频里去看具体讲解。 分类地址 IPv4地址被分为网络号和主机号&#xff0c;可分为A类地址、B类地址、C类地址、D类地址、E类地址。其中&#xff0c;只有A类、B类、C类地址的可用于给网络中的主机编址。 A类地址的网络号…

京东Java实习一面

第一次面试&#xff0c;被狠狠地拷打了 1.自我介绍 2.谈一谈你项目中比较难的一个点 3.为什么选择用两级缓存? 4.缓存和数据库数据一致性是如何保证的? 5.缓存遇到并发查询的情况怎么办? 6.synchronized和其它锁有什么区别? 7.Elasticsearch中用到了哪些类型?document是如…

【Jvm】性能调优(下)线上问题排查思路汇总

文章目录 前言性能调优&#xff08;上&#xff09;线上问题排查工具汇总JVM调优&#xff08;中&#xff09;Java中不得不了解的OOM Error 一.JVM参数1.参数分类2.非稳定参数&#xff08;-XX&#xff09;说明3.查询JVM默认参数及运行时生效参数4.常用参数5.GC日志相关参数6.发生…

嵌入式系统在智慧城市建设中的关键角色与挑战

&#xff08;本文为简单介绍&#xff0c;观点源于网络&#xff09; 智慧城市的概念&#xff0c;随着信息技术的日益发展而不断深化。它利用各种信息传感器&#xff0c;通过物联网、云计算、大数据等技术手段&#xff0c;实现城市管理的智能化、精细化。在这一过程中&#xff0…

jvm、jre、jdk的关系

jvm Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 字节码的虚拟机。 jre JRE&#xff08;Java Runtime Environment&#xff09; 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合&#xff0c;主要包括 Java 虚拟机&#xff08;JVM&#xff09;、J…

沁恒CH32V30X学习笔记06---串口dma接收+空闲中断组合接收数据

DMA 控制器提供 18 个通道,其中 DMA1 包含 7 个通道,DMA2 包含 11 个通道,每个通 道对应多个外设请求,通过设置相应外设寄存器中对应 DMA 控制位 通道映射 dma1 dma2 示例代码 bsp_usart_it.c /** bsp_usart_it.c** Created on: 2024年2月18日* Author: admin*/…

如何使音频类app广告变现收益最大化

要使音频类应用程序的广告变现收益最大化&#xff0c;可以采取以下策略&#xff1a; admaoyan猫眼聚合 精准定位受众&#xff1a; 了解你的用户群体&#xff0c;包括他们的兴趣、偏好和行为&#xff0c;以便向他们展示相关性更高的广告。使用用户数据分析工具&#xff0c;如Goo…

SPSSAU【文本分析】|LDA主题分析

LDA主题分析 LDA主题分析是一种提取出文本数据核心主题的模型&#xff0c;其可将整份数据文档的信息提取成几个主题&#xff0c;并且标题出主题与关键词之间的权重情况&#xff0c;用于识别主题的具体实际意义&#xff0c;除此之外&#xff0c;LDA主题分析涉及到可视化展示和图…

PyCharm 自动添加文件头注释

PyCharm 自动添加文件头注释 1. File and Code Templates2. Python FileReferences 1. File and Code Templates File -> Settings -> Editor -> File and Code Templates -> Python Script Reformat according to style & Enable Live Templates Created by…

stm32--笔记

一、引脚与变量 ​​​​​​​​​​​​​​ 二、STM32时钟 [STM32-时钟系统详解_stm32时钟_KevinFlyn的博客-CSDN博客] 三、定时器中断实验 1、定时器中断实验 ​ stm32关于通用定时器的周期、频率计算公式_stm32tim频率计算_胶囊咖啡的博客-CSDN博客 ​ 【STM32】通用…

2024.2.18 C++QT 作业

思维导图 练习题 1>定义一个基类 Animal&#xff0c;其中有一个虛函数perform&#xff08;)&#xff0c;用于在子类中实现不同的表演行为。 #include <iostream>using namespace std;class Animal { public:virtual void perform() {cout << "这是一个动…

pytest 框架自动化测试

随笔记录 目录 1. 安装 2. 安装pytest 相关插件 2.1 准备阶段 2.2 安装 2.3 验证安装成功 3. pytest测试用例的运行方式 3.1 主函数模式 3.1.1 主函数执行指定文件 3.1.2 主函数执行指定模块 3.1.3 主函数执行某个文件中的某个类、方法、函数 3.1.4 主函数执行生…

「优选算法刷题」:寻找数组的中心下标

一、题目 给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元…

怎么测试阿里云香港服务器是不是cn2?

阿里云服务器是CN2线路吗&#xff1f;云服务器BGP多线精品网络线路是cn2&#xff0c;香港轻量应用服务器不是cn2。 如何测试是不是中国电信cn2网络线路&#xff1f;可以本地公网 mtr 该公网IP地址看下是否走的CN2线路&#xff1a; 163骨干网出国的最后一跳IP开头是202.97CN2 …

Deployment

一、Deployment&#xff1a;管理部署发布的控制器 1、背景问题&#xff1a; 应用中的 Pod 如果出现了一些故障&#xff0c;如何保证集群内可用 Pod 的数量&#xff1f; 如何为所有 Pod 更新镜像版本&#xff1f; 在更新过程中&#xff0c;如何保证服务的可用性&#xff1f;…