Search code examples
c++qtqt4

How to get the system date and time using socket programming


I sending simple message from client to the server here and its working fine, But what if client wants to fetch the server system date and time.

Client

mainwindow.cpp

Client::Client(QObject* parent): QObject(parent)
{
    connect(&client, SIGNAL(connected()),
    this, SLOT(startTransfer()));
}

Client::~Client()
{
    client.close();
}

void Client::start(QString address, quint16 port)
{
    QHostAddress addr(address);
    client.connectToHost(addr, port);
}

void Client::startTransfer()
{
    client.write("Hi server this is client", 80);
}

I don't have any idea how to do that as i am new in QT c++. thank you so much in advance ...

server

main.cpp

    #include "mainwindow.h"
  #include <QApplication>



  int main(int argc, char** argv)
  {
    QApplication app(argc, argv);
    Server server;
    return app.exec();
  }

Solution

  • I think this part of code you released is client side , you should provide a request from client to server like common hand shaking.

    In server side you provide the date/time in a specific format that client can recognize it and send it. to seem more on client/server programming check Local Fortune Client and Local Fortune Server examples.

    here is your client side simple example:

    void Client::startTransfer()
    {
        client.write("Hi server send time");
        client.flush();
        client.waitForBytesWritten(300);
    }
    

    and you server side example :

    on newconnection slot in server connect client data to a slot like client message.

    void ServerSocket::newConnection()
    {
        QTcpSocket *clientsocket = mserver->nextPendingConnection();
        connect(clientsocket , SIGNAL(readyRead()) , this , SLOT(clientMessage()));
    }
    

    and respond it in slot client message

    void ServerSocket::clientMessage()
    {
        QTcpSocket* client = (QTcpSocket*)sender();
        QString  message(client->readAll());
        if (message == "Hi server send time")
        {
            client->write(QDateTime::currentDateTimeUtc().toString().toLatin1());
            client->flush();
            client->waitForBytesWritten(300);
        }
    }
    

    here is a complete code requested :

    servesocket.h

    #ifndef SERVERSOCKET_H
    #define SERVERSOCKET_H
    
    #include <QObject>
    #include <QDebug>
    #include <QTcpServer>
    #include <QTcpSocket>
    
    class ServerSocket : public QObject
    {
        Q_OBJECT
    public:
        explicit ServerSocket(QObject *parent = nullptr);
        QTcpServer *mserver;
    
    signals:
    
    public slots:
    
        void newConnection();
        void clientMessage();
    
    };
    
    #endif // SERVERSOCKET_H
    

    serversocket.cpp

    #include "serversocket.h"
    #include <QDateTime>
    
    ServerSocket::ServerSocket(QObject *parent) : QObject(parent)
    {
        mserver = new QTcpServer(this);
        mserver->connect(mserver , SIGNAL(newConnection()) , this , SLOT(newConnection()));
        if(!mserver->listen(QHostAddress::Any , 1234))
        {
            qDebug() << "Server initilize failed";
        }
    }
    
    void ServerSocket::newConnection()
    {
        QTcpSocket *clientsocket = mserver->nextPendingConnection();
        connect(clientsocket , SIGNAL(readyRead()) , this , SLOT(clientMessage()));
    }
    
    void ServerSocket::clientMessage()
    {
        QTcpSocket* client = (QTcpSocket*)sender();
        QString  message(client->readAll());
        if (message == "Hi server send time")
        {
            client->write(QDateTime::currentDateTimeUtc().toString().toLatin1());
            client->flush();
            client->waitForBytesWritten(300);
        }
    }
    

    MainWindow header

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QLineEdit>
    #include <QMainWindow>
    #include <QSerialPort>
    
    #include "serversocket.h"
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);//:QMainWindow(parent)
        ~MainWindow();
    
    private slots:
    
    
    
    private:
        Ui::MainWindow *ui;
        ServerSocket * server;
    
    };
    
    #endif // MAINWINDOW_H
    

    MainWindow cpp

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        server = new ServerSocket();
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }