有一个BUG,关注一下
当网络数据过来超过了8192就不在读取数据了, 下次网络再来会继续读取后续的,这样就有一个问题,信息不及时,延迟严重
bool CCNetDelegate::runRead() { while (true) { int nRet = m_oSocket.ccRead(m_pReadBuffer, SOCKET_READ_BUFFER_SIZE);
if( nRet == eSocketIoError || nRet == eSocketIoClosed )
{
unregisterScheduler();
m_oSocket.ccClose();
m_eStatus = eSocketIoClosed;
onDisconnected();
return true;
}
else
{
#if 1 CCLOG("CCSOCKET READ %d", nRet); #endif m_oReadBuffer.writeData(m_pReadBuffer, (unsigned int)nRet); #if USING_PACKAGE_HEAD_LENGTH
while( m_oReadBuffer.isReadable(sizeof(int)) )
{
m_oReadBuffer.moveReaderIndexToFront();
int n_head_len = m_oReadBuffer.readInt();
if( n_head_len <= 0 )
{
CCLOGERROR("invalidate head length");
m_oReadBuffer.moveLeft(sizeof(int));
}
int n_content_len = (int)m_oReadBuffer.length();
if( n_content_len - (int)(sizeof(int)) >= n_head_len )
{
m_oReadBuffer.moveLeft(sizeof(unsigned int));
CCBuffer* pData = m_oReadBuffer.readData(n_head_len);
m_oReadBuffer.moveLeft(n_head_len);
m_oReadBuffer.moveReaderIndexToFront();
m_oReadBuffer.moveWriterIndexToBack();
onMessageReceived(*pData);
}
else
{
break;
}
}
#else CCBuffer* pData = (CCBuffer*) m_oReadBuffer.copy(); pData->autorelease(); m_oReadBuffer.clear();
onMessageReceived(*pData);
#endif }
//保证数据是读取完了的,否则会掉信息
if ( nRet != SOCKET_READ_BUFFER_SIZE)
{
break;
}
}
return false;
}
也许有更好的办法, 还有一个问题, DEMO收网络数据过多,有卡顿很严重, 希望加入多线程处理
//保证数据是读取完了的,否则会掉信息 if ( nRet != SOCKET_READ_BUFFER_SIZE) { break; } 为什么要这样做,如果一次读不了nRet个字节,那不就死循环了吗,另外你说一次读太多了会卡,解决方案是这样,在一帧只读一次,通过这个宏来控制HANDLE_ON_SINGLE_FRAME
------------------ 原始邮件 ------------------ 发件人: "xysoko";[email protected]; 发送时间: 2014年10月22日(星期三) 下午5:47 收件人: "Jason-lee-c/CocosNet"[email protected];
主题: [CocosNet] 有一个BUG,关注一下 (#1)
当网络数据过来超过了8192就不在读取数据了, 下次网络再来会继续读取后续的,这样就有一个问题,信息不及时,延迟严重
— Reply to this email directly or view it on GitHub.
死循环 只会发生网络信息不停的来,从不间断就可会是死循环