unity学习(44)——选择角色菜单——顺利收到服务器的数据

本节的思路参考自,内容并不相同:13ARPG网络游戏编程实践(十三):角色选择UI及创建面板制作(四)_哔哩哔哩_bilibili

现在的代码写在MessageManager.cs中,函数名UserHandler(是从OnMessage跳过来的):

点击确定注册按钮后,客户端收到了如下数据包:

这里问题其实挺多的,账号信息要写到文件里(出字典的时候) 。。。一点点来吧,顺利的化,和注册部分的难度是持平的。

1.客户端确实收到了数据包!

2.但并没有把数据包加到List中。原因是因为长度有问题,大概率还是大小端导致的!

而且unity中Debug.Log("怎么都让我赶上了1");如果是纯字符串,有的时候是不会输出的

3.先去服务器查看一下包的组成是否有问题:服务器的UserHandler中如下代码已正常执行:

cs 复制代码
private void create(Session session, SocketModel model)
{
        Console.WriteLine("UserHandler.create!!!!!!!!!");
        string accId = OnLineUtil.getAccId(session);
        Console.WriteLine(accId);
  CreateDTO createDto = Coding<CreateDTO>.decode(model.Message);
        Console.WriteLine(model.Message);
        session.write(2, 0, 3, (object) BizUtil.user.create(accId, createDto.name, createDto.job));//本意是给对应键的部分增加2个值,而现在却查不到键
}

4.session.write的作用就是向客户端发送数据包,最后发现是这里的num1为空出了问题。

cs 复制代码
  public void write(int type, int area, int command, object message)
  {
    SocketModel socketModel = new SocketModel(type, area, command, (string) null);
    if (message != null)
      socketModel.Message = Coding<object>.encode(message);
    int num1 = 16;
    if (socketModel.Message != null)
      num1 += socketModel.Message.Length;
    ByteArray byteArray = new ByteArray();
          Console.WriteLine("num1:", num1);//都不是事
    byteArray.WriteInt(num1);
    byteArray.WriteInt(socketModel.Type);
    byteArray.WriteInt(socketModel.Area);
    byteArray.WriteInt(socketModel.Command);
    if (socketModel.Message != null)
    {
      int num2 = num1 + socketModel.Message.Length;
      byteArray.WriteInt(socketModel.Message.Length);
      byteArray.WriteUTFBytes(socketModel.Message);
    }
    else
      byteArray.WriteInt(0);
    this.socket.Send(byteArray.Buffer);
    Console.WriteLine("session.write返回给客户端的消息长度" + (object)byteArray.Buffer.Length);
          foreach (byte b in byteArray.Buffer)
          {
              Console.Write(b.ToString("x2"));//是不是还有个大小端的问题
          }
    Console.WriteLine(byteArray.Buffer.ToString());
          //MyLog.form.textAdd("消息长度" + (object) byteArray.Buffer.Length);
      }
}

5.重启服务器一下却没问题了,客户端得到了预期的结果

6.至于num1是空的原因,是因为Console.WriteLine中用"+"来输出多出,而不是","

7.239长度的数据包是userHandler中如下代码部分生成的:

cs 复制代码
private void create(Session session, SocketModel model)
{
        Console.WriteLine("UserHandler.create!!!!!!!!!");
        string accId = OnLineUtil.getAccId(session);
        Console.WriteLine(accId);
  CreateDTO createDto = Coding<CreateDTO>.decode(model.Message);
        Console.WriteLine(model.Message);
        session.write(2, 0, 3, (object) BizUtil.user.create(accId, createDto.name, createDto.job));//本意是给对应键的部分增加2个值,而现在却查不到键
}

里面包含了: 游戏角色的必要信息

{"id":"af2492c3-621b-4af8-96cb-1e599c9d4db2","name":"ddd556\u200B","job":1,"level":1,"exp":0,"atk":10,"def":5,"hp":50,"maxHp":50,"point":{"X":-2.21,"Y":13.83,"Z":7.5},"rotation":{"X":0.0,"Y":0.0,"Z":0.0,"W":0.0},"map":2}

相关推荐
月初,25 分钟前
MongoDB学习和应用(高效的非关系型数据库)
学习·mongodb·nosql
casual_clover1 小时前
Android 之 kotlin 语言学习笔记四(Android KTX)
android·学习·kotlin
Love__Tay1 小时前
【学习笔记】Python金融基础
开发语言·笔记·python·学习·金融
我的golang之路果然有问题2 小时前
云服务器部署Gin+gorm 项目 demo
运维·服务器·后端·学习·golang·gin
Lester_11013 小时前
嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析
笔记·stm32·单片机·学习·freertos
jackson凌3 小时前
【Java学习笔记】Math方法
java·笔记·学习
Humbunklung3 小时前
PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)
笔记·python·学习·pyqt
sealaugh324 小时前
aws(学习笔记第四十三课) s3_sns_sqs_lambda_chain
笔记·学习·aws
阿超爱嵌入式4 小时前
STM32学习之I2C(理论篇)
stm32·嵌入式硬件·学习
qq_454175794 小时前
c++学习-this指针
开发语言·c++·学习