Manual
do
Maker
.
com
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:
#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;
}
#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!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.