/// <summary> /// 开始接收网络数据 /// </summary> /// <param name="skt"></param> /// <param name="closeCB"></param> public void StartRcvData(Socket skt, Action closeCB) { try { this.skt = skt; this.closeCB = closeCB; //连接成功的回调 OnConnected(); NetPkg pack = new NetPkg(); //开始异步接收数据 skt.BeginReceive( pack.headBuff, 0, pack.headLen, SocketFlags.None, new AsyncCallback(RcvHeadData), pack); Console.WriteLine("接收数据:" + skt.ToString()); } catch (Exception e) { NetLogger.LogMsg("开始接收数据错误:" + e.Message, LogLevel.Error); } }
/// <summary> /// 接收包体数据 /// </summary> /// <param name="ar"></param> private void RcvBodyData(IAsyncResult ar) { try { NetPkg pack = (NetPkg)ar.AsyncState; 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, new AsyncCallback(RcvBodyData), pack ); } else { T msg = AnalysisMsg.DeSerialize <T>(pack.bodyBuff); OnReciveMsg(msg); //循环接收 pack.ResetData(); skt.BeginReceive( pack.headBuff, 0, pack.headLen, SocketFlags.None, new AsyncCallback(RcvHeadData), pack); } } else { OnDisConnected(); Clear(); } } catch (Exception e) { NetLogger.LogMsg("接收包体数据错误:" + e.Message, LogLevel.Error); } }
/// <summary> /// 接收包头数据 /// </summary> /// <param name="ar"></param> private void RcvHeadData(IAsyncResult ar) { try { //避免断开连接时,异步回调调用EndReceive会报错 /*if (skt==null) * { * NetLogger.LogMsg("当前对应客户端不存在,直接返回"); * return; * }*/ if (skt == null) { return; } NetPkg pack = (NetPkg)ar.AsyncState; if (skt.Available == 0) { OnDisConnected(); Clear(); return; } NetLogger.LogMsg("开始结束异步读取"); int len = skt.EndReceive(ar); if (len > 0) { pack.headIndex += len; //如果是小于4的就是凑不成一个包头,就是要分包继续接收 if (pack.headIndex < pack.headLen) { //接收数据 skt.BeginReceive( pack.headBuff, pack.headIndex, pack.headLen - pack.headIndex, SocketFlags.None, new AsyncCallback(RcvHeadData), pack); } else { //设置byte[]的长度 pack.InitBodyBuff(); skt.BeginReceive(pack.bodyBuff, 0, pack.bodyLen, SocketFlags.None, new AsyncCallback(RcvBodyData), pack); } } else { OnDisConnected(); Clear(); } } catch (Exception e) { NetLogger.LogMsg("接收包头数据错误:" + e.Message, LogLevel.Error); } }