本节的思路参考自,内容并不相同:13ARPG网络游戏编程实践(十三):角色选择UI及创建面板制作(四)_哔哩哔哩_bilibili
现在的代码写在MessageManager.cs中,函数名UserHandler(是从OnMessage跳过来的):
点击确定注册按钮后,客户端收到了如下数据包:
这里问题其实挺多的,账号信息要写到文件里(出字典的时候) 。。。一点点来吧,顺利的化,和注册部分的难度是持平的。
1.客户端确实收到了数据包!
2.但并没有把数据包加到List中。原因是因为长度有问题,大概率还是大小端导致的!
而且unity中Debug.Log("怎么都让我赶上了1");如果是纯字符串,有的时候是不会输出的。
3.先去服务器查看一下包的组成是否有问题:服务器的UserHandler中如下代码已正常执行:
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为空出了问题。
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);}elsebyteArray.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中如下代码部分生成的:
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}