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