[英]QTcpSocket readyRead() Signal emitted twice
我有QTcpServer。 當服務器上接收到所有數據時,我想從客戶端發送大數據以及如何捕獲信號? “ while(socket-> bytesavailable)”不起作用。
例如:
當qbytearray大小是9000(從客戶端發送)時,在服務器上是4000或5000 ...
示例二:
在這種情況下,readyRead()信號被發射8次。
void Client::SendMessage(std::vector<QString>)
{
MyClass _Send;
_Send.Age = 22;
_Send.School = 14;
_Send.Name = "Taz";
QVector<MyClass2> vv;
for (int i = 0; i < 15000; i++) {
vv.push_back(MyClass2(24, "leri"));
vv.push_back(MyClass2(22, "tazo"));
}
_Send.vctr = vv;
QByteArray bytes;
QDataStream stream(&bytes, QIODevice::WriteOnly);
int FunctionUID = 331;
int ij, ik = ij = 169;
MyClass2 faf(-31, "15");
stream << FunctionUID << _Send << faf << ij << ik;
socket->write(bytes);
}
void Server::ImReady()
{
QByteArray buf;
buf = socket->readAll();
QDataStream stream(&buf, QIODevice::ReadOnly);
int FunctionUID, ij, ik;
MyClass vv;
MyClass2 vv1;
stream >> FunctionUID >> vv >> vv1 >> ij >> ik;
qDebug() << vv.vctr.size() << "faf";
}
void Server::incomingConnection(qintptr val)
{
qDebug() << "Client Connected" << val;
socket = new QTcpSocket;
socket->setSocketDescriptor(val);
if (!socket) {
return;
}
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
connect(socket, SIGNAL(readyRead()), this, SLOT(ImReady()));
}
TCP不發送消息,它是數據流。 這意味着您不能只讀取其中的所有數據,而只考慮一條消息。 取而代之的是,通常發送一個包含消息大小的標頭,然后接收者知道要讀取多少消息才能獲得整個消息(只有這個消息,而不是下一個消息)。
這意味着您的廣告位會執行以下操作
void Server::ImReady()
{
uint32 size;
socket->read(&size, 4);
uint32 readTotal = 0;
do {
readTotal += socket->read(buffer, size-readTotal);
} while (readTotal < size);
}
你可以像這樣寫一條線
if (socket->bytesAvailable() == 0)
return;
在插槽的開頭,然后您根本不會在乎每條消息發出的信號是否超過一次。
請注意,上面的代碼需要額外的錯誤處理,例如,您必須確保第一次read
會讀取所有4個字節,並且始終處理返回值-1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.