/// <summary> /// 异步接收数据线程 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void ProcessReceiveThreadCallback(object sender, UploadDataCompletedEventArgs e) { try { // 消息异常处理 if (e.Error != null) { string errorState = e.Error.GetType().Name; if (errorState == "WebException") { WebException webExp = (WebException)e.Error; HttpWebResponse response = (HttpWebResponse)webExp.Response; mStatueCodeQueue.Enqueue(response.StatusCode); } return; } // httpClient // WebClient mClient = (WebClient)sender; // 返回结果 if (e.Result != null && e.Result.Length > 0) { byte[] buffer = e.Result; PBPacket packet = new PBPacket(); packet.Decoder(buffer); EnqueuePacket(packet); } } catch (Exception ex) { new Exception("not achieve " + ex.ToString()); } finally { mCanSend = true; } }
/// <summary> /// 处理缓冲区中的数据包 /// </summary> /// <param name="recvLen"></param> void TryParsePacket(int recvLen) { // 更新标识 mReceivePos += recvLen; // 包头长度 int headerSize = PBConst.PB_HEAD_SIZE; while (mReceivePos >= headerSize) { try { // 获取到消息包体长度 int bodySize = BitConverter.ToInt32(mRecvBuff, 0); int packetSize = headerSize + bodySize; // 检查是否满足一个包长度 if (mReceivePos >= packetSize) { PBPacket packet = new PBPacket(); packet.Decoder(mRecvBuff); if (packet == null) { continue; } EnqueuePacket(packet); // 接收缓冲区偏移处理 for (int i = 0; i < (mReceivePos - packetSize); i++) { mRecvBuff[i] = mRecvBuff[packetSize + i]; } mReceivePos -= packetSize; } else { break; } } catch (Exception ex) { new Exception("not achieve " + ex.ToString()); break; } } }