QTcpSocket read write buffer
write时,系统不保证一次发送完毕,所以应当循环write
假设发送一个QByteArray arr;
int size=socket.write(arr);
while(size < arr.size() )
{
size += socket.write( arr.right(arr.size() - size ) );
}
读的时候,直接用socket读,可以用QDataStream读,只是用QDataStream的话,一定要确定当前可读的字节数满足你读的需要
可以参考Qt自带的例子中中,ForntueClient;
1 先判断可读的字节数够不够sizeof(qint32)或者sizeof(qint16), 按照你的协议
2 够的话,就读这个为size,不够的话,返回,等待下次readyRead触发你的slot;或者调用waitForReadReady进行阻塞式的等待
3 判断bytesAvailable够不够size,够则读; 不够则“返回,等待下次readyRead触发你的slot;或者调用waitForReadReady进行阻塞式的等待”
上述返回后,依然保留着size在类中,所以,有个类的设计问题。
见到一个新的写发,本质上一样的,似乎有点新意
- while( true )
- {
- switch( state )
- {
- case WaitSize:
- if( stream.bytesAvailable() < sizeof( dataSize ) ) return;
- sretam >> dataSize;
- state = WaitData;
- break;
- case WaitData:
- if( stream.bytesAvailable() < dataSize ) return;
- // read the data
- state = WaitSize;
- break;
- }
- }