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内容应该是服务器所返回数据包的内容:

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

相关推荐
别动我齐刘海2 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
gjf05_055 小时前
人该怎样活着呢?版本75.8
学习
拂拉氏6 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Fcy6486 小时前
Linux下 五种IO模型的认识与⾮阻塞IO的实现
linux·服务器·io
li星野7 小时前
【学习记录】PCB与PCBA核心知识全解析:从设计到制造的关键细节
学习·制造
流浪打工人7 小时前
Unity3d TimeLine中audio track的使用
unity
卿卿的产品经理日记7 小时前
【AI产品经理实战】Day 35|从“沉迷工具“到回归 AI 底层:Skill 收官、系统复盘与下一个 13 天
人工智能·学习·产品经理
一条泥憨鱼8 小时前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
天国梦8 小时前
国密门禁品牌怎么选?2026年最新3个避坑要点
运维·服务器·数据库·python
HY小宝F8 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 04 · HTTP / API:控制链入口 —— 学习总结
网络协议·学习·http