Esempio n. 1
0
        /// <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);
            }
        }
Esempio n. 2
0
 /// <summary>
 /// 发送网络数据
 /// </summary>
 /// <param name="msg"></param>
 public void SendMsg(T msg)
 {
     byte[] data = AnalysisMsg.PackLenInfo(AnalysisMsg.Serialize <T>(msg));
     SendMsg(data);
 }