本节的思路参考自,内容并不相同: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);
}
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中如下代码部分生成的:
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}