示例#1
0
        //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);
            }
        }