Search code examples
qttcptcpclienttcplistener

Basic Qt tcp-server application only show selected clients messages


I am developing a simple tcp server with qt. There is no problem with that. But the problem is, i have listed every connected client in a listbox and i want to see the incoming data only from the selected client from the listbox but i can only see the last connected client's messages. here is the code, this is the constructor part

server = new QTcpServer();
    client = new QTcpSocket();
    connect(server, SIGNAL(newConnection()),this, SLOT(acceptConnection()));
    server->listen(QHostAddress::Any, ui->txtPort->text().toInt(bool(),10));
    if(server->isListening())
    {
        ui->statusBar->showMessage("Server Started..");
    }
    else
    {
        ui->statusBar->showMessage("Server Not Started..");
    }

    connect(client,SIGNAL(disconnected()),this,SLOT(client_disconnected()));

    connect(ui->listWidget,SIGNAL(clicked(QModelIndex)),this,SLOT(selected_client()));

here is acceptConnection() part

client = server->nextPendingConnection();

    ui->listWidget->insertItem(client_count,client->peerAddress().toString());
    client_count++;

and this is the listWidget item's selected item event

ui->txtRead->clear();
    selected_client_index = ui->listWidget->currentIndex().row();
    connect(client, SIGNAL(readyRead()),this, SLOT(startRead()));

and lastly the startRead() part

   char buffer[1024] = {0};
   client->read(buffer, client->bytesAvailable());
   qDebug() << buffer;
   ui->txtRead->insertPlainText(buffer);

How can i select the specific client and show its messages ? Thanks in advance.


Solution

  • You should not use client in startRead, but some selectedClient, that You remembers in selected_client() SLOT.
    As for now, when You use client = server->nextPendingConnection(), You are losing any previous clients. You should save them into some QList<QTcpSocket*>.