在服务器LoginHandler类中:
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的定义如下:
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中,队列定义如下:
private static List<SocketModel> messageList = new List<SocketModel>();
很明显这是个网络包队列,唯一的增加队列元素的方法如下:
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的调用,是我之前漏了!
修改后的代码如下!
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到tempaddMessage(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内容应该是服务器所返回数据包的内容:
返回的数据包有错,应该是编码问题!