本節的思路參考自,內容并不相同: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}