/// <summary> /// 接收包体数据 /// </summary> /// <param name="ar"></param> protected void RcvBodyData(IAsyncResult ar) { try { //结束接收获取长度 int len = skt.EndReceive(ar); if (len > 0) { pack.bodyIndex += len; //这里是如果接收到的包长和原本获取到的长度小,就是分包了 需要再次进行接收剩下的 if (pack.bodyIndex < pack.bodyLen) { skt.BeginReceive( pack.bodyBuff, pack.bodyIndex, pack.headLen - pack.bodyIndex, SocketFlags.None, RcvBodyData, null); } //已经接完一组数据了 else { //这里就可以进行回调函数了 T msg = AnalysisMsg.DeSerialize <T>(pack.bodyBuff); OnReciveMsg(msg); OnReciveMsgEvent?.Invoke(msg); //开始新一轮的从上往下接收了 pack.ResetData(); pack.headBuff = new byte[4]; skt.BeginReceive( pack.headBuff, 0, 4, SocketFlags.None, ReciveHeadData, null); } } else { Clear(); } } catch (Exception e) { NetLogger.LogMsg($"ReciveDataError:{e}", LogLevel.Error); } }
/// <summary> /// 发送网络数据 /// </summary> /// <param name="msg"></param> public void SendMsg(T msg) { byte[] data = AnalysisMsg.PackLenInfo(AnalysisMsg.Serialize <T>(msg)); SendMsg(data); }