@mariappan Perhaps if you run this client/server pair you will better understand what is happening, and why this is not "a bogus".
Client:
#ifndef CLIENT_H
#define CLIENT_H
#include <QObject>
#include <QTcpSocket>
#include <QTimer>
class Client : public QObject
{
Q_OBJECT
public:
explicit Client(QObject *parent = nullptr);
private slots:
void handleConnected();
void handleDisconnected();
void handleErrorOccurred(QAbstractSocket::SocketError socketError);
void handleBytesWritten(qint64 bytes);
void sendPacket();
private:
QTcpSocket *m_socket;
QTimer *m_timer;
int m_packetNo;
};
#endif // CLIENT_H
#include "client.h"
#include <QTimer>
#include <QRandomGenerator>
Client::Client(QObject *parent)
: QObject{parent}
, m_socket{ new QTcpSocket(this) }
, m_timer{ new QTimer(this) }
, m_packetNo{0}
{
m_timer->setInterval(500);
connect(m_timer, &QTimer::timeout, this, &Client::sendPacket);
connect(m_socket, &QTcpSocket::connected, this, &Client::handleConnected);
connect(m_socket, &QTcpSocket::disconnected, this, &Client::handleDisconnected);
connect(m_socket, &QTcpSocket::errorOccurred, this, &Client::handleErrorOccurred);
connect(m_socket, &QIODevice::bytesWritten, this, &Client::handleBytesWritten);
m_socket->connectToHost(QHostAddress("127.0.0.1"), 12345);
}
void Client::handleConnected() {
qDebug() << "Connected, sending packets.";
m_timer->start();
}
void Client::handleDisconnected() {
qDebug() << "Disconnected";
m_timer->stop();
}
void Client::handleErrorOccurred(QAbstractSocket::SocketError socketError) {
qDebug() << "Error occured" << socketError;
m_timer->stop();
}
void Client::handleBytesWritten(qint64 bytes) {
qDebug() << "Bytes written" << bytes;
}
void Client::sendPacket() {
// Generate a sample fixed-length payload
QByteArray data;
data.setNum(m_packetNo++);
data = data.rightJustified(32, '.');
m_socket->write(data);
qDebug() << "Wrote" << data;
// Sometimes we write more than one
quint32 value = QRandomGenerator::global()->generate();
if ((value % 3) == 1) {
data.setNum(m_packetNo++);
data = data.rightJustified(32, '*');
m_socket->write(data);
qDebug() << "Wrote" << data;
}
}
#include <QCoreApplication>
#include <QDebug>
#include <QTimer>
#include "client.h"
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
Client client;
QTimer::singleShot(30000, qApp, &QCoreApplication::quit);
return app.exec();
}
Server:
#ifndef SERVER_H
#define SERVER_H
#include <QObject>
#include <QTcpServer>
class Server : public QObject
{
Q_OBJECT
public:
explicit Server(QObject *parent = nullptr);
private slots:
void handleNewConnection();
private:
QTcpServer *m_server;
};
class ClientHandler: public QObject {
Q_OBJECT
public:
explicit ClientHandler(QTcpSocket *socket, QObject *p = nullptr);
private slots:
void handleReadyRead();
void handleDisconnected();
private:
QTcpSocket *m_socket;
};
#endif // SERVER_H
#include "server.h"
#include <QDebug>
#include <QTcpSocket>
Server::Server(QObject *parent)
: QObject{parent}
, m_server{ new QTcpServer(this) }
{
connect(m_server, &QTcpServer::newConnection, this, &Server::handleNewConnection);
m_server->listen(QHostAddress("127.0.0.1"), 12345);
}
void Server::handleNewConnection() {
while(m_server->hasPendingConnections()) {
QTcpSocket *socket = m_server->nextPendingConnection();
qDebug() << "Accepted connection from " << socket->peerAddress() << socket;
ClientHandler *client = new ClientHandler(socket, this);
Q_UNUSED(client);
}
}
ClientHandler::ClientHandler(QTcpSocket *socket, QObject *p)
: QObject(p)
, m_socket(socket)
{
socket->setParent(this);
connect(socket, &QTcpSocket::readyRead, this, &ClientHandler::handleReadyRead);
connect(socket, &QTcpSocket::disconnected, this, &ClientHandler::handleDisconnected);
}
void ClientHandler::handleReadyRead() {
qDebug() << m_socket<< "readyRead received.";
QByteArray data = m_socket->readAll();
qDebug() << data;
}
void ClientHandler::handleDisconnected() {
qDebug() << m_socket << "disconnect";
deleteLater();
}
#include <QCoreApplication>
#include "server.h"
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
Server server;
return app.exec();
}