簡體   English   中英

QTcpSocket readyRead()發出兩次信號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM