QTcpServer или QTcpClient (на стороне сервера) знают, что подключенный клиент теперь отключен - PullRequest
0 голосов
/ 13 июня 2011

в следующем коде я могу определить, подключен ли клиент и добавлена ​​ли строка в QTableWidget, но как я могу узнать, что клиент отключен, чтобы я мог удалить строку отключенного клиента из той же таблицы.

TcpServer::TcpServer(QWidget *parent) :QDialog(parent),ui(new Ui::TcpServer)
{
    ui->setupUi(this);
    m_coSerSo =new CoServerSocket(this);
    count=0;


   connect(m_coSerSo,SIGNAL(newConnection()),this, SLOT(updateConnectionTable()));
 }

 TcpServer::~TcpServer()
 {
    delete ui;
 }
 void TcpServer::updateConnectionTable()
 { 
     int row = ui->tableWidget->rowCount();
     ui->tableWidget->setRowCount(row + 1);
     ui->tableWidget->setItem(row, 0, new QTableWidgetItem(m_coSerSo->getPeerAdd()));
     ui->tableWidget->setItem(row, 1,
          new QTableWidgetItem(QDateTime::currentDateTime ().toString()));
}


CoServerSocket::CoServerSocket(QObject *parent)
    : QTcpServer(parent)
{ peerAdd ="good1";

}

void CoServerSocket::incomingConnection(int socketId)
{
    socketClient = new CoClientSocket(this);
    socketClient->setSocketDescriptor(socketId);

    peerAdd =  socketClient->peerAddress().toString();
}
QString CoServerSocket::getPeerAdd()
{
    return peerAdd;
}

1 Ответ

0 голосов
/ 13 июня 2011

Сокет, который вы создаете внутри incomingConnection(int), имеет сигнал disconnected(). Используйте QSignalMapper, чтобы определить, какой сокет был отключен, и обновить представление таблицы. Быстрый и грязный код, вероятно, полезный и, конечно, полный синтаксических ошибок:

TcpServer::TcpServer(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TcpServer)
{
    ui->setupUi(this);
    m_coisSerSo = new CoisServerSocket(this);
    count = 0;

    // The mapper forwards the signal from the client socket,
    // adding the socket itself as an argument.

    this->mapper = new QSignalMapper(this);
    connect(this->mapper, SIGNAL(mapped(QObject*)), 
            this, SLOT(clientDisconnected(QObject*)));


    connect(m_coisSerSo,SIGNAL(newConnection()),this, SLOT(updateConnectionTable()));
}

void CoisServerSocket::incomingConnection(int socketId)
{
    socketClient = new CoisClientSocket(this);
    socketClient->setSocketDescriptor(socketId);

    // Map the socket so that we can receive its disconnection
    // notification. When the socket emits the "disconnected()"
    // signal, the mapper will emit "mapped(QObject*)" and will
    // pass the socket as the argument.

    this->mapper->setMapping(socketClient, socketClient);
    connect(socketClient, SIGNAL(disconnected()), this->mapper, SLOT(map()));

    peerAdd =  socketClient->peerAddress().toString();
}

void CoisServerSocket::clientDisconnected(QObject* object)
{
    if (CoisClientSocket* client = qobject_cast<CoisClientSocket*>(object))
    {
        // Unmap the socket.

        this->mapper->removeMappings(client);

        // Handle disconnection here.

        ...

        // A consequence of mixing a TCP server and a dialog in the
        // same class is that passing "this" as an argument to the
        // socket constructor doesn't help much with memory management. 
        // They will stay around as long as the dialog lives. Delete 
        // them once they aren't needed anymore.

        client->deleteLater();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...