20.如何解析我们客户端的信息并且交给ControllerManager来进行处理
首先是Message类,参数分别是数据的长度和一个回掉的函数委托,用来重复解析数据,这里的话前四个是数据长度,后面4-8是RequestCode,8-12是ActionCode,12以后是数据,我们按照这个来重复对数据进行解析
publicvoid ReadMessage(intnewDateAmount,Action<RequestCode,ActionCode,string> ProcessDataCallBack)
{
startIndex += newDateAmount;
while (true)
{
if (startIndex <= 4)
{
return;
}
//读取数组的长度,自动省略前四个字节长度
int count = BitConverter.ToInt32(data, 0);
if (startIndex - 4 >= count)
{
//解析的是传递的RequestCode
RequestCode requestCode =(RequestCode)BitConverter.ToInt32(data, 4);
//解析ActionCode
ActionCode actionCode =(ActionCode)BitConverter.ToInt32(data, 8);
//解析我们的数据,从12开始,解析的长度为count-8
String s =Encoding.UTF8.GetString(data, 12, count-8);
//回调解析
ProcessDataCallBack(requestCode, actionCode,s);
Array.Copy(data, count + 4,data, 0, startIndex - count - 4);
startIndex -= (count + 4);
}
else { break; }
}
}
然后我们要在Sever里提供一个中介方法来调用ControllerManager里的HandelRequest来处理对客户端发送信息的解析
publicvoidHandleRequest(RequestCode requestCode, ActionCode actionCode, string data, Clientclient)
{
//这个作为中介,用来作为client和ControllerManager的中间商
controllerManager.HandleRequest(requestCode,actionCode, data, client);
}
然后我们在客户端里重复调用ReadMessage完成对信息的解析
publicvoidReceiveCallBack(IAsyncResult ar)
{
try
{
int count = clientSocket.EndReceive(ar);
if (count == 0)
{
Close();
}
//使用message对client接收到的信息进行解析,这里分别传递的参数是数据长度和回调的方法
message.ReadMessage(count,OnProcessMessage);
Start();
}
catch (Exception e)
{
Close();
Console.WriteLine(e);
}
}
//回调信息的处理,这里使用sever里的HandleRequest来处理对客户端的响应,为了避免耦合没有直接使用ControllerManager
publicvoid OnProcessMessage(RequestCoderequestCode,ActionCode actionCode,string data)
{
sever.HandleRequest(requestCode,actionCode, data, this);
}
21.打包解析我们客户端发送的数据
1.我们在Message里提供一个工具类来打包我们的客户端发送的数据
publicstaticbyte[]PackData(RequestCode requestCode,string data)
{
//这个方法是用来打包数据
byte[] requestCodeBytes = BitConverter.GetBytes((int)requestCode);
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
int dataAmount = requestCodeBytes.Length + dataBytes.Length;
byte[] dataAmountBytes = BitConverter.GetBytes(dataAmount);
byte[]newdata=dataAmountBytes.Concat(requestCodeBytes).Concat(dataBytes) asbyte[];
return newdata;
}
2.在客户端里向socket发送打包后的信息
publicvoid SendMessage(RequestCoderequestCode,string data)
{
byte[]sendData= Message.PackData(requestCode, data);
clientSocket.Send(sendData);
}
3.在服务器中介中调用这个客户端发送消息的方法
publicvoid SendMessage(Clientclient,RequestCode requestCode,string data)