完善ClientPeer接收消息:
- 定义List<>集合,类型为byte,数据缓冲区
- 使用解析包解析出来
- 转换成NetMessage网络消息类
- 回调给Server端
public SocketAsyncEventArgs ReceiveArgs { get; set; }
/// <summary>
/// 接收到消息的数据缓冲区
/// </summary>
private List<byte> cache = new List<byte>();
/// <summary>
/// 是否在处理接收到的消息
/// </summary>
private bool isReceiveProgessData = false;
/// <summary>
/// 接收消息完毕后的回调,让服务器段处理,去发送给应用层处理。
/// </summary>
public delegate void ReceiveCompleted(ClientPeer client, NetMsg msg);
public ReceiveCompleted receiveCompleted;
/// <summary>
/// 处理数据的接收
/// </summary>
/// <param name="packet"></param>
public void ProcessReceive(byte[] packet)
{
cache.AddRange(packet);
if (isReceiveProgessData == false)
{
ProcessData();
}
}
/// <summary>
/// 处理结束到的数据,调用解析包,最后转换成NetMsg类
/// </summary>
private void ProcessData()
{
isReceiveProgessData = true;
//使用解析包,把数据解析出来
byte[] packet = EncodeTools.DecodePacket(ref cache);
if (packet == null)
{
isReceiveProgessData = false;
return;
}
//将数据转换成网络消息类,加上操作码
NetMsg msg = EncodeTools.DecodeMsg(packet);
if (receiveCompleted != null)//回调给服务器端,服务器段发送给应用层,应用层根据操作码分发到所属模块
{
receiveCompleted(this, msg);
}
ProcessData();
}
ClientPeer接收完毕后,回调给Server
- 在填满Client连接池时,对回调进行赋值
//赋值:
for (int i = 0; i < maxClient; i++)
{
ClientPeer client = new ClientPeer();
**client.receiveCompleted = ReceiveProcessCompleted;**
client.ReceiveArgs.Completed += ReceiveArgs_Completed;
clientPeerPool.Enqueue(client);
}
//回调方法:
/// <summary>
/// 客户端处理消息完毕后的回调,发送到应用层
/// </summary>
private void ReceiveProcessCompleted(ClientPeer client, NetMsg msg)
{
//TODO
}
完善ClientPeer发送消息:
public void SendMsg(int opCode,int subCode,object value)
{
msg.Change(opCode,subCode,value);
byte[] data = EncodeTools.EncodeMsg(msg);//把msg转换未byte数组
byte[] packet = EncodeTools.EncodePacket(data);//构造包,加上包头和包尾
SendMsg(packet);//发送消息
}
private void SendMsg(byte[] packet)
{
try
{
clientSocket.Send(packet);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
完善ClientPeer自身断开连接:
/// <summary>
/// 断开连接
/// </summary>
public void DisConnected()
{
cache.Clear();
isReceiveProgessData = false;
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
clientSocket = null;
}
有需要学习视频的欢迎关注微信公众号