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; } }