void * YHSocketSendThread::Execute()
{
	bool loop = true;
	
	while(loop)
	{
		try
		{
			m_manager->m_condition.LockMutEx();
			
			// 如果没有消息等待发送, 则等待, 添加消息后, 该线程将被唤醒
			while (m_manager->m_queue->count() == 0)
			{
				m_manager->m_condition.Wait();
				
				if (m_destroy)
				{
					m_manager->m_condition.UnlockMutEx();
					return NULL;
				}
			}
			
			YHByteArray * bytes = (YHByteArray *)m_manager->m_queue->objectAtIndex(0);
			bytes->retain();
			m_manager->m_queue->removeObjectAtIndex(0);
			
			m_manager->m_condition.UnlockMutEx();
			
			// 阻塞, 将消息发送出去
			m_manager->m_connectManager->connectedSocket()->SendData(bytes->getBuffer(), bytes->readableBytes());
			bytes->release();
			
			if (m_destroy)
			{
				loop = false;
			}
		}
		catch (SocketException e)
		{
			m_manager->m_connectManager->close();
			
			m_manager->m_condition.LockMutEx();
			m_manager->m_queue->removeAllObjects();
			m_manager->m_condition.UnlockMutEx();
			
			CCLOG("%s", (const char *)e);
			loop = false;
		}
		catch (ThreadException e)
		{
			CCLOG("%s", (const char *)e);
		}
	}
	
	return NULL;
}
void * YHSocketRecvThread::Execute()
{
	bool loop = true;
	while (loop)
	{
		try
		{
			// 接收包头
			YHByteArray header;
			header.init(4);
			m_manager->m_connectManager->connectedSocket()->RecvData(header.getBuffer(), header.getCapacity(), MSG_WAITALL);
			
			uint32 size = header.getUnsignedInt(0);
			
			// 接收实际内容
			YHByteArray * content = new YHByteArray();
			content->init(size);
			m_manager->m_connectManager->connectedSocket()->RecvData(content->getBuffer(), size, MSG_WAITALL);
			content->setWriterIndex(size);
			
			// 将接收到的数据添加进队列
			m_manager->m_mutex.Lock();
			m_manager->m_queue->addObject(content);
			content->release();
			m_manager->m_mutex.Unlock();
		}
		catch (SocketException e)
		{
			m_destroy = true;
			
			m_manager->m_connectManager->close();
			
			m_manager->m_mutex.Lock();
			m_manager->m_queue->removeAllObjects();
			m_manager->m_mutex.Unlock();
			
			CCLOG("%s", (const char *)e);
		}
		catch (ThreadException e)
		{
			CCLOG("%s", (const char *)e);
		}
		
		if (m_destroy)
		{
			loop = false;
		}
	}
	
	return NULL;
}
void YHHttpClient::onResponseCallBack(cocos2d::extension::CCHttpClient * client,
									  cocos2d::extension::CCHttpResponse * response)
{
	std::vector<char> * rawData = response->getResponseData();
	if (rawData->size() != 0)	// 这里之所以不用 isSuccess() 是因为又是接收到数据, 但是也报错, 所以按是否接收到数据判断是否接收成功
	{
		std::vector<char>::iterator beg = rawData->begin();
		std::vector<char>::iterator end = rawData->end();
		YHByteArray * bytes = new YHByteArray();
		bytes->init(rawData->size());
		for (; beg != end; ++beg)
		{
			bytes->writeChar(*beg);
		}
		m_queue->addObject(bytes);
		bytes->release();
	}
	else
	{
		CCLOG("Http error: %s", response->getErrorBuffer());
	}
}