QTcpSockets, добавленные в QList, похоже, исчезают из списка - PullRequest
0 голосов
/ 20 мая 2019

Я создаю QTcpServer для отправки потока MJPEG клиентам, которые подключаются к серверу. Когда я получаю сигнал newConnection от сервера, я добавляю QTcpSocket в QList. Затем другая функция получает кадры и проверяет, не является ли QList непустым. Проблема в том, что даже после получения соединения QList с точки зрения другой функции остается пустым.

Я установил QTcpServer следующим образом:

  server = new QTcpServer(this);

  connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));

Затем при каждом новом подключении:

void 
MjpegServer::newConnection() {

    if(!socketMutex.tryLock(1000)) {
        qCritical() << "Could not lock sendFrame Mutex to add new client";
        return;
    }

    while(server->hasPendingConnections()) {
        qInfo() << "Got new MJPEG Connection";
        m_clients.append(server->nextPendingConnection());

        QByteArray ContentType = ("HTTP/1.0 200 OK\r\n" \
            "Cache-Control: no-cache\r\n" \
            "Pragma: no-cache\r\n" \
            "Connection: close\r\n" \
            "Content-Type: multipart/x-mixed-replace; boundary=mjpegstream\r\n\r\n");
        m_clients.last()->write(ContentType);
        m_clients.last()->flush();
        m_clients.last()->waitForBytesWritten(3000);

        connect(m_clients.last(), &QTcpSocket::disconnected, this, &MjpegServer::socketDisconnected);
        connect(m_clients.last(), SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));

        qInfo() << "Clients now connected: " + QString::number(m_clients.count());
    }

    socketMutex.unlock();
}

Когда я запускаю код и клиент подключается, я получаю распечатку, в которой говорится, что m_clients.count () равен 1. У меня есть функция, которая отправляет видеокадры:

void
MjpegServer::sendFrame(Mat &img) {

    if(!socketMutex.tryLock(1000)) {
        qCritical() << "Could not lock sendFrame Mutex";
        return;
    }

    // Only encode if there are connected clients
    if(m_clients.count() == 0) {
        socketMutex.unlock();
        qInfo() << "No clients";
        return;
    }

    qInfo() << "Encoding image";
    std::vector<uchar> outbuf;
    std::vector<int> params;
    params.push_back(CV_IMWRITE_JPEG_QUALITY);
    params.push_back(100);
    imencode(".jpg", img, outbuf, params);

    std::string content(outbuf.begin(), outbuf.end());
    QByteArray CurrentImg(QByteArray::fromStdString(content));
    QByteArray BoundaryString = ("--mjpegstream\r\nContent-Type: image/jpeg\r\nContent-Length: ");
    BoundaryString.append(QString::number(CurrentImg.length()));
    BoundaryString.append("\r\n\r\n");

    for( int i=0; i < m_clients.count(); ++i ) {
        qInfo() << "Writing data to client " + QString::number(i);
        QTcpSocket* socket = m_clients.at(i);
        socket->write(BoundaryString);
        socket->write(CurrentImg); // Write The Encoded Image
        socket->flush();
    }
    socketMutex.unlock();
}

Прямо сейчас это только печатает "Нет клиентов". Даже после того, как клиент подключился. У меня также есть сигналы, подключенные к монитору, когда QTcpSockets отключены или их состояние меняется, эти сигналы не срабатывают. Соединения QTcpSockets, кажется, не отключаются, но функция sendFrame не может видеть их в QList.

Буду признателен за любую помощь ...

...