private void AsyncWriteRequestStream(IAsyncResult ar) { // 取出回调前的状态参数 MyCallbackParam cp = (MyCallbackParam)ar.AsyncState; RequestMessageWrapper sendMessageWrapper = cp.State; byte[] requestData = sendMessageWrapper.MessageBody.ToByteArray(); try { // 结束写入数据的操作 using (Stream bw = cp.Request.EndGetRequestStream(ar)) { bw.Write(requestData, 0, requestData.Length); } // 开始异步向服务器发起请求 cp.Request.BeginGetResponse(GetResponseCallback, cp); } catch (Exception e) { //Debug.LogError(string.Format("rsping msg id :{0} - {1}", sendMessageWrapper.MessageId, e.ToString())); this.m_context.Post(WorkQueueCallback, new SendMessageCallback() { MessageId = sendMessageWrapper.MessageId, Status = NetworkModule.NetworkStatus.LOG_ERROR }); } }
private void T_DoASyncSend(RequestMessageWrapper sendMessageWrapper, HttpWebRequest request) { MyCallbackParam cp = new MyCallbackParam() { State = sendMessageWrapper, Request = request, }; request.BeginGetRequestStream(AsyncWriteRequestStream, cp); }
private void GetResponseCallback(IAsyncResult ar) { // 取出回调前的状态参数 MyCallbackParam cp = (MyCallbackParam)ar.AsyncState; RequestMessageWrapper sendMessageWrapper = cp.State as RequestMessageWrapper; long start_time = m_sending_times[sendMessageWrapper.m_unique_identifier]; m_sending_times.Remove(sendMessageWrapper.m_unique_identifier); try { // 读取服务器的响应 using (HttpWebResponse response = (HttpWebResponse)cp.Request.EndGetResponse(ar)) { using (Stream responseStream = response.GetResponseStream()) { int responseBufferLength = (int)response.ContentLength; if (response.Headers["msgId"] == null) { Debug.Log("error message no message id on response header"); return; } else { int messageId = int.Parse(response.Headers["msgId"]); if (messageId == 400) { GOEngine.DebugUtil.Log($"server error == 400 ,server ip:{this.m_serverIp}"); } else if (messageId == 1) { GOEngine.DebugUtil.Log($"server error == 1 ,remote login"); } byte[] buffer = new byte[responseBufferLength]; responseStream.Read(buffer, 0, responseBufferLength); if (!string.IsNullOrEmpty(response.Headers["errorCode"])) { int errorCode = int.Parse(response.Headers["errorCode"]); string errorContent = Encoding.UTF8.GetString(buffer); EngineCoreEvents.SystemEvents.NetWorkError.SafeInvoke(errorCode, errorContent); } else { long delta_time = CommonUtils.GetCurTimeMillSenconds() - start_time; Debug.LogWarning($"C# HTTP ASYNC : cur msg {sendMessageWrapper.MessageId} total cost {delta_time} ms"); IMessage message = EngineCore.MessageParser.Parse(messageId, buffer); this.m_messageQueue.Enqueue(new ResponseMessageWrapper(messageId, message)); } } } } } catch (Exception e) { //Debug.LogError(string.Format("rsping msg id :{0} - {1}", sendMessageWrapper.MessageId, e.ToString())); this.m_context.Post(WorkQueueCallback, new SendMessageCallback() { MessageId = sendMessageWrapper.MessageId, Status = NetworkModule.NetworkStatus.LOG_ERROR }); } }