Manual

do

Maker

.

com

Qt - Conexão persistente com QTCPServer

Qt - Conexão persistente com QTCPServer

Gosto de pegar exemplos através de pesquisa no Google, modificando o código de exemplo a meu gosto, ou no mínimo, entendendo a funcionalidade para escrever apenas o que pretendo. Mas nem tudo pode ser encontrado pronto, então, para que no futuro eu não precise passar por testes novamente, escrevi um código básico para testar a conexão persistente usando o QTCPServer e o disponibilizo aqui, mude a seu gosto e deixe-me dicas!

Para quem não souber a diferença, conexão persistente é aquela que continua aberta após o envio de uma mensagem; conexões não-persistentes são aquelas que fecham imediatamente após o envio da mensagem.

Indo ao código:

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->Server = new QTcpServer(this);
    this->socket = new QTcpSocket(this);
    this->reconnectTo();
    connect(Server, SIGNAL(newConnection()), this, SLOT(ReceiveData()));
}
void MainWindow::tellMeMore()
{
    QByteArray data = socket->readAll();
    socket->write("Recebi. bjs");
    socket->write("n");
    ui->textEdit->append(data);
}
void MainWindow::ReceiveData()
{
    if (this->getNext){
        this->socket = Server->nextPendingConnection();
        this->getNext = false;
        connect(socket,SIGNAL(readyRead()),this,SLOT(tellMeMore()));
        connect(socket,SIGNAL(disconnected()),this,SLOT(reconnectTo()));
    }
    if (!socket){
        qDebug() << "saindo em ReceiveData";
        return;
    }
    ui->textEdit->setText("Conectado");
}
void MainWindow::reconnectTo()
{
    this->socket->close();
    this->Server->close();
    this->getNext = true;
    QHostAddress add;
    add.setAddress("127.0.0.1");
    if(!Server->listen(add, 9000)) {
        ui->textEdit->clear();
        ui->textEdit->setText("Nao conectou");
        return;
    }
    times +=1;
    //ui->textEdit->setText("Conectou "+QString::number(times)+ " vezes");
}
MainWindow::~MainWindow()
{
    delete ui;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
    void ReceiveData();
    void tellMeMore();
    void reconnectTo();
private:
    Ui::MainWindow *ui;
    QTcpServer *Server;
    QTcpSocket *socket;
    bool getNext=true;
};
#endif // MAINWINDOW_H

Fiz um projeto com janela, então incluí um QTextEdit para alimentar com a mensagem. Para testar, abra uma conexão telnet na port 9000 e troque mensagens a vontade. Encerre a conexão telnet ( Ctrl+] e quit) e reabra. Tudo deverá funcionar sem problemas.

Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.