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

在服务器LoginHandler类中:

cs 复制代码
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的定义如下:

cs 复制代码
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中,队列定义如下:

cs 复制代码
private static List<SocketModel> messageList = new List<SocketModel>();

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

cs 复制代码
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的调用,是我之前漏了

修改后的代码如下!

cs 复制代码
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到temp
        addMessage(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内容应该是服务器所返回数据包的内容:

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

相关推荐
鹿鸣悠悠7 分钟前
【AI学习】全链路、并发、响应时间
学习
PNP Robotics18 分钟前
领军军者|PNP机器人包文涛:以具身智能定义机器人的“生命直觉”
人工智能·深度学习·学习·机器学习·机器人
QYQ_112735 分钟前
嵌入式学习——字符设备驱动的注册和调用流程
学习
你好,帅哥38 分钟前
openssl ,msys2 ,交叉编译
linux·运维·服务器
天人合一peng43 分钟前
unity 生成标记根据背景色标记变色
unity·游戏引擎
xinhuanjieyi1 小时前
极语言让ai学习的方法
开发语言·学习
念恒123061 小时前
Python(复杂判断)
python·学习
happymaker06261 小时前
MyBatis学习日记——DAY03(手写MyBatis框架实现简单功能)
学习
Web极客码2 小时前
2026年Linux VPS安全加固清单:SSH、防火墙与审计就绪配置
运维·服务器·数据库
山楂树の2 小时前
原生 WebGL + Canvas 实现鱼眼图像去畸变(Shader逐像素计算)
图像处理·数码相机·学习·程序人生