void AsyncIOServer::OnRecvEvent(Socket* socket) {
	Client* client = (Client *)(socket->data);
	if( client != NULL ) {
//		switch_log_printf(
//				SWITCH_CHANNEL_LOG,
//				SWITCH_LOG_DEBUG,
//				"AsyncIOServer::OnRecvEvent( client : %p, socket : %p ) \n",
//				client,
//				socket
//				);

		// 尝试读取数据
		char buf[READ_BUFFER_SIZE];
		switch_size_t len = sizeof(buf);
		switch_status_t status = SWITCH_STATUS_SUCCESS;
		bool disconnect = false;

		// 有足够的缓存空间
		if( client->CheckBufferEnough() ) {
			while (true) {
				status = mTcpServer.Read(socket, (char *)buf, &len);
//				status = switch_socket_recv(socket->socket, (char *)buf, &len);
				if( status == SWITCH_STATUS_SUCCESS ) {
					// 读取数据成功, 缓存到客户端
//					switch_log_printf(
//							SWITCH_CHANNEL_LOG,
//							SWITCH_LOG_DEBUG,
//							"AsyncIOServer::OnRecvEvent( client : %p, socket : %p, read ok ) \n",
//							client,
//							socket
//							);

					if( client->Write(buf, len) ) {
						// 放到处理队列
//						switch_log_printf(
//								SWITCH_CHANNEL_LOG,
//								SWITCH_LOG_DEBUG,
//								"AsyncIOServer::OnRecvEvent( client : %p, socket : %p, client write buffer ok ) \n",
//								client,
//								socket
//								);

						RecvHandle(client);

					} else {
						// 没有足够的缓存空间
						switch_log_printf(
								SWITCH_CHANNEL_LOG,
								SWITCH_LOG_INFO,
								"AsyncIOServer::OnRecvEvent( client : %p, socket : %p, write error ) \n",
								client,
								socket
								);
						disconnect = true;
						break;
					}
				} else if( SWITCH_STATUS_IS_BREAK(status) /*|| (status == SWITCH_STATUS_INTR)*/ ) {
					// 没有数据可读超时返回, 不处理
//					switch_log_printf(
//							SWITCH_CHANNEL_LOG,
//							SWITCH_LOG_DEBUG,
//							"AsyncIOServer::OnRecvEvent( client : %p, socket : %p, nothing to read ) \n",
//							client,
//							socket
//							);
					break;
				} else {
					// 读取数据出错, 断开
					switch_log_printf(
							SWITCH_CHANNEL_LOG,
							SWITCH_LOG_INFO,
							"AsyncIOServer::OnRecvEvent( client : %p, socket : %p, read error : %d ) \n",
							client,
							socket,
							status
							);
					disconnect = true;
					break;
				}
			}
		} else {
			// 缓存数据过大, 断开
			switch_log_printf(
					SWITCH_CHANNEL_LOG,
					SWITCH_LOG_INFO,
					"AsyncIOServer::OnRecvEvent( client : %p, socket : %p, buffer not enough error ) \n",
					client,
					socket
					);
			disconnect = true;
		}

		if( disconnect ) {
			Disconnect(client);
		}

		bool bFlag = false;
		switch_mutex_lock(client->clientMutex);
		bFlag = ClientCloseIfNeed(client);
		switch_mutex_unlock(client->clientMutex);

		if( bFlag ) {
			// 回调
			if( mpAsyncIOServerCallback ) {
				mpAsyncIOServerCallback->OnDisconnect(client);
			}

			// 关闭Socket
			mTcpServer.Close(client->socket);

			// 销毁客户端
			Client::Destroy(client);
		}
	}
}