private void OnRecv(GameResponse resp) { // System.Console.WriteLine("GameSocket Recv: {0}", resp.ToString()); // Log.Debug("GameSocket Recv: {0}", resp.ToString()); if (resp == null) { return; } bool done = false; if (resp.Sequence > 0) { DateTime now = DateTime.Now; foreach (var item in callbacks) { if (item.Sequence == resp.Sequence) { //double ms= (now - item.SendTime).TotalMilliseconds; // if (ms > 1000) // MessageTip.GetInstance().ShowMessage("协议: CmdId=" + resp.CmdId + ",耗时 =" + ms + "ms"); // Log.Debug("Response: CmdId={0}, CostTime={1}ms", resp.CmdId, (now - item.SendTime).TotalMilliseconds); done = true; callbacks.Remove(item); item.Callback(resp.Result, resp); break; } } } if (!done) { foreach (var item in listeners) { if (item.CmdId == resp.CmdId) { done = true; item.Listener(resp.CmdId, resp.Result, resp); } } } //全局报错 if (resp.Result != 0) { System.Console.Write("Cmd:" + resp.CmdId + ",Result:" + resp.Result); //XEventBus.Instance.Post(EventId.GameCommonError, resp.Result); } if (!done) { System.Console.WriteLine("GameClient未处理消息:{0}", resp); } }
public void Process() { while (queues.Count > 0) { GameResponse resp = queues.Dequeue(); OnRecv(resp); //Threader.RunOnMainThread(() => OnRecv(resp)); } checkTimeout(); }
private void checkTimeout() { CallbackInfo item = null; DateTime now = DateTime.Now; for (int i = callbacks.Count - 1; i >= 0; i--) { //超时 item = callbacks[i]; if (now >= item.TimeOut) { //callbacks.Remove(item); var resp = new GameResponse(item.CmdId, item.Sequence, -99); //Log.Debug("GameSocket:Timeout CmdId={0},Seq={1},Result={2}", resp.CmdId, resp.Sequence, resp.Result); queues.Enqueue(resp); //MessageTip.GetInstance().ShowMessage("连接超时!"); } } if (diffTime <= 0f) { diffTime = Time.time; } //超时机制 if (callbacks.Count > 0 && Time.time - diffTime < timeout) { if (Time.time - diffTime > 0.5f) { // LayerManager.GetInstance().ShowLoadingMask(); } } else { diffTime = 0; //LayerManager.GetInstance().CloseLoadingMask(); } }
//private void checkThread() //{ // while (true) // { // Thread.Sleep(1000); // CallbackInfo item = null; // DateTime now = DateTime.Now; // for (int i = callbacks.Count - 1; i >= 0; i--) // { // //超时 // item = callbacks[i]; // if (now >= item.TimeOut) // { // callbacks.Remove(item); // var resp = new GameResponse(item.CmdId, item.Sequence, -99); // //OnRecv(resp); // MessageTip.GetInstance().ShowMessage("连接超时!"); // Log.Debug("GameSocket:Timeout CmdId={0},Seq={1},Result={2}", resp.CmdId, resp.Sequence, resp.Result); // queues.Enqueue(resp); // } // } // } //} private void recvThread() { int max_buffer = 1024 * 64; byte[] buffer = new byte[max_buffer]; bool bReadedHead = false; int iTotalLen = 0; int iRecvLen = 0; bool nextPacket = true; short msgLen = 0; while (!closeing) { if (!mSocket.Connected) { break; } if (nextPacket) { //强断有异常 iRecvLen = mSocket.Receive(buffer, iTotalLen, max_buffer - iTotalLen, SocketFlags.None); System.Console.WriteLine("Recv len={0}", iRecvLen); Debug.Log("iRecvLen:" + iRecvLen); if (iRecvLen <= 0) { //网络断开 break; } iTotalLen += iRecvLen; } //先读包头 if (!bReadedHead && iTotalLen > 3) { msgLen = (short)((buffer[1] & 0xff) << 8); msgLen += (short)(buffer[2] & 0xff); bReadedHead = true; } if (bReadedHead && iTotalLen >= msgLen) { Debug.Log("读取数据"); byte[] temp = new byte[msgLen - 3]; Array.Copy(buffer, 3, temp, 0, msgLen - 3); var resp = GameResponse.Decode(temp); iTotalLen -= msgLen; if (iTotalLen > 0) { Array.Copy(buffer, msgLen, buffer, 0, iTotalLen); } bReadedHead = false; //lock (lockObj) { queues.Enqueue(resp); } //OnRecv(resp); // Log.Debug("GameSocket:Recv CmdId={0},Seq={1},Result={2}", resp.CmdId, resp.Sequence, resp.Result); nextPacket = (iTotalLen == 0); } else { nextPacket = true; } Thread.Sleep(10); } }