使用QTcpSocket的TCP数据包
我知道TCP保证所有数据包都会到达。 但是,数据包可以分成两个或更多? 我正在使用类QTcpSocket的Qt,我想知道是只有当完整的数据包到达ReadyRead信号发射。 换句话说,在第一个字节中发送数据包的大小是否有意义,然后再循环直到所有字节到达? 或者我可以调用socket-> readAll(),我必须得到一个完整的数据包?
如果发送大量数据,则数据包可以分开到达。 或者,可以在一个readyRead插槽中接收多个消息。
通过将第一个字节设置为将要发送的字节数来控制这是一个很好的做法。 然后,在readyRead中,读取第一个字节并将数据附加到缓冲区,直到收到预期的数据量。
在接收数据时,这也意味着,如果在readyRead()的一个调用中接收到多条消息,则可以知道第一条消息结束和下一条消息开始的位置。
下面是一个在readyRead函数中接收数据的客户端的例子()
void MyClass::readyRead() { // m_pConnection is a QTcpSocket while(m_pConnection->bytesAvailable()) { QByteArray buffer; int dataSize; m_pConnection->read((char*)&dataSize, sizeof(int)); buffer = m_pConnection->read(dataSize); while(buffer.size() < dataSize) // only part of the message has been received { m_pConnection->waitForReadyRead(); // alternatively, store the buffer and wait for the next readyRead() buffer.append(m_pConnection->read(dataSize - buffer.size())); // append the remaining bytes of the message } QString msg(buffer); // data in this case is JSON, so we can use a QString emit Log(QString("\tMessage Received: %1").arg(msg)); // Do something with the message ProcessMessage(msg); } }