Esempio n. 1
0
    void Update()
    {
        curTime = Time.time;
        switch (socketTaskState)
        {
        case SocketTaskState.STS_IDLE:
            //什么都不做
            break;

        case SocketTaskState.STS_CONNECTING:
            //套接字正在连接中
            //检测是否链接成功
            if (tcpSocket.ConncetSuccess())
            {
                //链接成功
                ChangeSocketTaskState(SocketTaskState.STS_WORKING);
                lastReceivePacketTime = Time.time;
                //判断是第一次链接成功还是重连成功
                Log.Logic("Connect success, startConnectTime={0}, curTime={1}", lastReconnectTime, lastReceivePacketTime);
                Eventer.Fire("ConnectSuccess", new object[] { });

                //ResetReconnectMask(false);
            }
            else
            {
                float now = Time.time;
                if (now > lastReconnectTime + CONNECT_TIMEOUT)
                {
                    //链接超时了
                    Log.Logic("Connect timeout, startConnectTime={0}, curTime={1}", lastReconnectTime, now);
                    DestroyCurrentSocket();
                    //ChangeSocketTaskState(SocketTaskState.STS_DISCONNECT);
                    ChangeSocketTaskState(SocketTaskState.STS_IDLE);
                    Eventer.Fire("ConnectFailed", new object[] {});
                }
            }
            break;

        //case SocketTaskState.STS_DISCONNECT:
        //    if (!reconnectMask || reconnectCount >= autoReconnectMaxCount)
        //    {
        //        Log.Logic("reconnectMask={0}, reconnectCount={1}, connectFailed", reconnectMask, reconnectCount);
        //        //不支持重连,或许重连达到最大次数
        //        Eventer.Fire("ConnectFailed", new object[] { reconnectMask });
        //        //进入空闲状态
        //        ChangeSocketTaskState(SocketTaskState.STS_IDLE);
        //    }
        //    else
        //    {
        //        //进行重连
        //        float now = Time.time;
        //        tcpSocket = new TcpSocket();
        //        if (tcpSocket.Connect(serverAddr))
        //        {
        //            reconnectCount++;
        //            Log.Logic("start reconnect, reconnectMask={0}, reconnectCount={1}, time={2}", reconnectMask, reconnectCount, now);
        //            ChangeSocketTaskState(SocketTaskState.STS_CONNECTING);
        //            lastReconnectTime = Time.time;
        //        }
        //        else
        //        {
        //            Log.Logic("reconnect failed, reconnectMask={0}, reconnectCount={1}, time={2}", reconnectMask, reconnectCount, now);
        //            //直接连接失败了。不用检查重试了
        //            DestroyCurrentSocket();
        //            Eventer.Fire("ConnectFailed", new object[] { reconnectMask });
        //            ChangeSocketTaskState(SocketTaskState.STS_IDLE);
        //        }
        //    }
        //    break;
        case SocketTaskState.STS_WORKING:
            //接收数据

            if (!tcpSocket.DoMessageRecv(ref msgQueue))
            {
                //读取数据失败了
                Log.Logic("tcpSocket.DoMessageRecv failed");
                OnDisconnect();
            }
            else
            {
                float now = Time.time;
                if (msgQueue.Count == 0)
                {
                    if (now >= lastReceivePacketTime + RECEIVE_TIMEOUT)
                    {
                        Log.Logic("tcpSocket.DoMessageRecv timeout, lastReceivePacketTime={0} now={1}", lastReceivePacketTime, now);
                        //接收数据超时,当作断开处理
                        OnDisconnect();
                    }
                }
                else
                {
                    //有消息
                    lastReceivePacketTime = now;
                    Log.Logic("tcpSocket.DoMessageRecv success, update lastReceivePacketTime={0}", lastReceivePacketTime);
                    foreach (IncomingPacket packet in msgQueue)
                    {
                        Eventer.Fire("CompletePacket", new object[] { packet });
                    }
                    msgQueue.Clear();
                }
            }
            break;
        }
    }