我有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不发送消息,它是数据流。这意味着您不能只读取其中的所有数据并考虑这一条消息。取而代之的是通常发送一个包含消息大小的 header ,然后接收者知道要读取多少才能获得完整的消息(只有这个,而不是读入下一个)。

这意味着您的广告位会执行以下操作

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。

关于c++ - QTcpSocket readyRead()发出两次信号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46707313/

10-16 19:10