/// <summary> /// 处理网络操作线程 /// </summary> private void WebThreadHandle() { while (m_threadRunFlag) { if (!m_netRunFlag) { continue; } HttpPacket sendPacket = null; lock (m_sendQueue) { if (m_sendQueue.Count > 0) { sendPacket = m_sendQueue.Dequeue(); } } if (null == sendPacket) { Thread.Sleep(c_ThreadSleepTime); continue; } try { byte[] bytes = NetEnCoder.Encode(sendPacket); byte[] byteRes = m_webClient.UploadData(NetHttpManager.Instance.GetUrl(), c_httpMethod, bytes); if (null != byteRes) { //解析http返回包 //目前解析 太浪费内存、使用缓冲区 int resLength = byteRes.Length; int offset = 0; int nLength = NetEnCoder.DecodeInt(byteRes, ref offset); resLength -= offset; if (resLength >= nLength) { uint uCode = NetEnCoder.DecodeUInt(byteRes, ref offset); int nCount = nLength - NetEnCoder.GetIntLength(); object msg = PBEnCoder.Decode(uCode, byteRes, offset, nCount); HttpPacket recvPacket = new HttpPacket(uCode, nCount); recvPacket.handler = sendPacket.handler; lock (m_recvQueueLocker) { m_recvQueue.Enqueue(recvPacket); } } } } catch (WebException e) { LoggerHelper.Except(e); } } }
/// <summary> /// HttpPacket -> bytes /// </summary> /// <param name="packet"></param> /// <returns></returns> public static byte[] Encode(HttpPacket packet) { int len = 0; byte[] codeBytes = GetBytes(packet.uCode); len += codeBytes.Length; byte[] bodyBytes = GetBytes(packet.msgBody); len += bodyBytes.Length; byte[] lengthBytes = GetBytes(len); byte[] result = null; using (MemoryStream ms = new MemoryStream()) { BinaryWriter br = new BinaryWriter(ms); ///备注:发送内容=长度(Code和body所占字节长度) + nCode + body br.Write(lengthBytes); br.Write(codeBytes); br.Write(bodyBytes); result = ms.ToArray(); } return(result); }
/// <summary> /// 发送http请求 /// </summary> /// <param name="p"></param> public void SendHttp(HttpPacket p) { lock (m_sendQueue) { m_sendQueue.Enqueue(p); } }