Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Console application & QTcpSocket
Forum Updated to NodeBB v4.3 + New Features

Console application & QTcpSocket

Scheduled Pinned Locked Moved Solved General and Desktop
24 Posts 5 Posters 3.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • SPlattenS Offline
    SPlattenS Offline
    SPlatten
    wrote on last edited by
    #14

    @Bonnie ,@jsulm ,@KroMignon , odd results now, I've modified the console app main to:

    QCoreApplication a(intArgc, parystrArgv);
    QCoreApplication::setApplicationName(clsModFileIO::scpszTitle());
    clsModFileIO obj(&a, intArgc, parystrArgv);
    return a.exec();
    

    In the clsModFileIO constructor:

    QObject::connect(this, SIGNAL(connected()), this, SLOT(onConnected()));
    QObject::connect(this, SIGNAL(connected()), this, SLOT(onSendModuleStartupMsg()));
    QObject::connect(this, SIGNAL(connected()), this, SLOT(onStartHeartbeat()));
    QObject::connect(this, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
    QObject::connect(this, &QAbstractSocket::errorOccurred, this, &clsModHelper::onErrorOccurred);
    QObject::connect(this, &QIODevice::readyRead, this, &clsModHelper::onDataIn);
    QObject::connect(this, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));        
    

    This class is derived from QTcpSocket. OnConnected is a pure virtual slot. I am getting a receipt in onDataIn, but the encoding looks messed up, I am sending on JSON in my messages, what I get back looks like Japanese:

    笢浯摵汥∺≘䵌䵐䅍≽
    
    jsulmJ KroMignonK B 3 Replies Last reply
    0
    • SPlattenS SPlatten

      @Bonnie ,@jsulm ,@KroMignon , odd results now, I've modified the console app main to:

      QCoreApplication a(intArgc, parystrArgv);
      QCoreApplication::setApplicationName(clsModFileIO::scpszTitle());
      clsModFileIO obj(&a, intArgc, parystrArgv);
      return a.exec();
      

      In the clsModFileIO constructor:

      QObject::connect(this, SIGNAL(connected()), this, SLOT(onConnected()));
      QObject::connect(this, SIGNAL(connected()), this, SLOT(onSendModuleStartupMsg()));
      QObject::connect(this, SIGNAL(connected()), this, SLOT(onStartHeartbeat()));
      QObject::connect(this, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
      QObject::connect(this, &QAbstractSocket::errorOccurred, this, &clsModHelper::onErrorOccurred);
      QObject::connect(this, &QIODevice::readyRead, this, &clsModHelper::onDataIn);
      QObject::connect(this, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));        
      

      This class is derived from QTcpSocket. OnConnected is a pure virtual slot. I am getting a receipt in onDataIn, but the encoding looks messed up, I am sending on JSON in my messages, what I get back looks like Japanese:

      笢浯摵汥∺≘䵌䵐䅍≽
      
      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #15

      @SPlatten said in Console application & QTcpSocket:

      what I get back looks like Japanese

      Can't comment on that as I don't know what you are sending back and what encoding you're using.

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      SPlattenS 1 Reply Last reply
      0
      • jsulmJ jsulm

        @SPlatten said in Console application & QTcpSocket:

        what I get back looks like Japanese

        Can't comment on that as I don't know what you are sending back and what encoding you're using.

        SPlattenS Offline
        SPlattenS Offline
        SPlatten
        wrote on last edited by
        #16

        @jsulm, I haven't called any encoding methods, what is the default?

        jsulmJ 1 Reply Last reply
        0
        • SPlattenS SPlatten

          @jsulm, I haven't called any encoding methods, what is the default?

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #17

          @SPlatten For QString you can find this information in the documentation: https://doc.qt.io/qt-5/qstring.html

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0
          • SPlattenS SPlatten

            @Bonnie ,@jsulm ,@KroMignon , odd results now, I've modified the console app main to:

            QCoreApplication a(intArgc, parystrArgv);
            QCoreApplication::setApplicationName(clsModFileIO::scpszTitle());
            clsModFileIO obj(&a, intArgc, parystrArgv);
            return a.exec();
            

            In the clsModFileIO constructor:

            QObject::connect(this, SIGNAL(connected()), this, SLOT(onConnected()));
            QObject::connect(this, SIGNAL(connected()), this, SLOT(onSendModuleStartupMsg()));
            QObject::connect(this, SIGNAL(connected()), this, SLOT(onStartHeartbeat()));
            QObject::connect(this, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
            QObject::connect(this, &QAbstractSocket::errorOccurred, this, &clsModHelper::onErrorOccurred);
            QObject::connect(this, &QIODevice::readyRead, this, &clsModHelper::onDataIn);
            QObject::connect(this, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));        
            

            This class is derived from QTcpSocket. OnConnected is a pure virtual slot. I am getting a receipt in onDataIn, but the encoding looks messed up, I am sending on JSON in my messages, what I get back looks like Japanese:

            笢浯摵汥∺≘䵌䵐䅍≽
            
            KroMignonK Offline
            KroMignonK Offline
            KroMignon
            wrote on last edited by KroMignon
            #18

            @SPlatten said in Console application & QTcpSocket:

            This class is derived from QTcpSocket. OnConnected is a pure virtual slot. I am getting a receipt in onDataIn, but the encoding looks messed up, I am sending on JSON in my messages, what I get back looks like Japanese:
            笢浯摵汥∺≘䵌䵐䅍≽

            Again this depends how you have written data on socket and how you read them on the other side.
            You should know that for Qt QString internally always stored in UTF-8, but when you send it "outside" you have to take care about which string format is to be used.

            Please show the JSON write to socket and JSON read from socket code.

            It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

            1 Reply Last reply
            0
            • SPlattenS SPlatten

              @Bonnie ,@jsulm ,@KroMignon , odd results now, I've modified the console app main to:

              QCoreApplication a(intArgc, parystrArgv);
              QCoreApplication::setApplicationName(clsModFileIO::scpszTitle());
              clsModFileIO obj(&a, intArgc, parystrArgv);
              return a.exec();
              

              In the clsModFileIO constructor:

              QObject::connect(this, SIGNAL(connected()), this, SLOT(onConnected()));
              QObject::connect(this, SIGNAL(connected()), this, SLOT(onSendModuleStartupMsg()));
              QObject::connect(this, SIGNAL(connected()), this, SLOT(onStartHeartbeat()));
              QObject::connect(this, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
              QObject::connect(this, &QAbstractSocket::errorOccurred, this, &clsModHelper::onErrorOccurred);
              QObject::connect(this, &QIODevice::readyRead, this, &clsModHelper::onDataIn);
              QObject::connect(this, SIGNAL(bytesWritten(qint64)), this, SLOT(onBytesWritten(qint64)));        
              

              This class is derived from QTcpSocket. OnConnected is a pure virtual slot. I am getting a receipt in onDataIn, but the encoding looks messed up, I am sending on JSON in my messages, what I get back looks like Japanese:

              笢浯摵汥∺≘䵌䵐䅍≽
              
              B Offline
              B Offline
              Bonnie
              wrote on last edited by Bonnie
              #19

              @SPlatten
              I remember you're sending a QByteArray ( from QJsonDocument::toJson() ) by QDataStream.
              Do you also use QDataStream to read to a QByteArray in onDataIn?

              SPlattenS 1 Reply Last reply
              1
              • B Bonnie

                @SPlatten
                I remember you're sending a QByteArray ( from QJsonDocument::toJson() ) by QDataStream.
                Do you also use QDataStream to read to a QByteArray in onDataIn?

                SPlattenS Offline
                SPlattenS Offline
                SPlatten
                wrote on last edited by SPlatten
                #20

                @Bonnie , @jsulm , @KroMignon , this is my send function:

                void clsModHelper::sendJSON(QJsonObject& objJSON) {
                    if ( isOpen() != true ) {
                        return;
                    }
                    //Associate this TCP socket with the output data stream
                    QByteArray arybytMsg;
                    QDataStream dsOut(&arybytMsg, QIODevice::WriteOnly);
                    //dsOut.setDevice(this);
                    dsOut.setVersion(clsJSON::mscintQtVersion);
                    //Send message to data stream
                    dsOut << QJsonDocument(objJSON).toJson(QJsonDocument::Compact);
                    //Write message
                    write(arybytMsg);
                }
                

                And receiving:

                void clsModFileIO::onDataIn() {
                    QDataStream dsIn;
                    dsIn.setDevice(this);
                    dsIn.setVersion(clsJSON::mscintQtVersion);
                
                    QString strRx;
                    dsIn.startTransaction();
                    dsIn >> strRx;
                
                    if ( strRx.isEmpty() != true ) {
                        qdbg() << "onDataIn: " << strRx;
                    }
                    if ( dsIn.commitTransaction() == false ) {
                        return;
                    }
                }
                

                clsModFileIO is derived from clsModHelper. clsJSON::mscintQtVersion is defined as:

                const int clsJSON::mscintQtVersion      = QDataStream::Qt_5_14;
                
                JonBJ KroMignonK 2 Replies Last reply
                0
                • SPlattenS SPlatten

                  @Bonnie , @jsulm , @KroMignon , this is my send function:

                  void clsModHelper::sendJSON(QJsonObject& objJSON) {
                      if ( isOpen() != true ) {
                          return;
                      }
                      //Associate this TCP socket with the output data stream
                      QByteArray arybytMsg;
                      QDataStream dsOut(&arybytMsg, QIODevice::WriteOnly);
                      //dsOut.setDevice(this);
                      dsOut.setVersion(clsJSON::mscintQtVersion);
                      //Send message to data stream
                      dsOut << QJsonDocument(objJSON).toJson(QJsonDocument::Compact);
                      //Write message
                      write(arybytMsg);
                  }
                  

                  And receiving:

                  void clsModFileIO::onDataIn() {
                      QDataStream dsIn;
                      dsIn.setDevice(this);
                      dsIn.setVersion(clsJSON::mscintQtVersion);
                  
                      QString strRx;
                      dsIn.startTransaction();
                      dsIn >> strRx;
                  
                      if ( strRx.isEmpty() != true ) {
                          qdbg() << "onDataIn: " << strRx;
                      }
                      if ( dsIn.commitTransaction() == false ) {
                          return;
                      }
                  }
                  

                  clsModFileIO is derived from clsModHelper. clsJSON::mscintQtVersion is defined as:

                  const int clsJSON::mscintQtVersion      = QDataStream::Qt_5_14;
                  
                  JonBJ Online
                  JonBJ Online
                  JonB
                  wrote on last edited by
                  #21

                  @SPlatten
                  But you are sending a QJsonDocument::toJson() which returns a QByteArray and receiving a QString? So....

                  1 Reply Last reply
                  1
                  • SPlattenS SPlatten

                    @Bonnie , @jsulm , @KroMignon , this is my send function:

                    void clsModHelper::sendJSON(QJsonObject& objJSON) {
                        if ( isOpen() != true ) {
                            return;
                        }
                        //Associate this TCP socket with the output data stream
                        QByteArray arybytMsg;
                        QDataStream dsOut(&arybytMsg, QIODevice::WriteOnly);
                        //dsOut.setDevice(this);
                        dsOut.setVersion(clsJSON::mscintQtVersion);
                        //Send message to data stream
                        dsOut << QJsonDocument(objJSON).toJson(QJsonDocument::Compact);
                        //Write message
                        write(arybytMsg);
                    }
                    

                    And receiving:

                    void clsModFileIO::onDataIn() {
                        QDataStream dsIn;
                        dsIn.setDevice(this);
                        dsIn.setVersion(clsJSON::mscintQtVersion);
                    
                        QString strRx;
                        dsIn.startTransaction();
                        dsIn >> strRx;
                    
                        if ( strRx.isEmpty() != true ) {
                            qdbg() << "onDataIn: " << strRx;
                        }
                        if ( dsIn.commitTransaction() == false ) {
                            return;
                        }
                    }
                    

                    clsModFileIO is derived from clsModHelper. clsJSON::mscintQtVersion is defined as:

                    const int clsJSON::mscintQtVersion      = QDataStream::Qt_5_14;
                    
                    KroMignonK Offline
                    KroMignonK Offline
                    KroMignon
                    wrote on last edited by KroMignon
                    #22

                    @SPlatten as @JonB has already written QJsonDocument::toJson() returns a QByteArray not as QString.

                    You have to send and read the same thing if you want it to work!

                    void clsModFileIO::onDataIn() {
                        QDataStream dsIn;
                        dsIn.setDevice(this);
                        dsIn.setVersion(clsJSON::mscintQtVersion);
                    
                        QByteArray jsonArray;
                        dsIn.startTransaction();
                        dsIn >> jsonArray;
                    
                        QJsonDocument doc;
                        if ( jsonArray.isEmpty() != true ) {
                            qdbg() << "onDataIn: " << jsonArray;
                            doc = QJsonDocument::fromJson(jsonArray);
                        }
                        if ( dsIn.commitTransaction() == false ) {
                            return;
                        }
                    }
                    

                    [EDIT] This only works if you also change the send:

                    void clsModHelper::sendJSON(QJsonObject& objJSON) {
                        if ( isOpen() != true ) {
                            return;
                        }
                        //Associate this TCP socket with the output data stream
                        QDataStream dsOut;
                        dsOut.setDevice(this);
                        dsOut.setVersion(clsJSON::mscintQtVersion);
                        //Send message to data stream
                        dsOut << QJsonDocument(objJSON).toJson(QJsonDocument::Compact);
                    }
                    

                    It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                    SPlattenS 2 Replies Last reply
                    3
                    • KroMignonK KroMignon

                      @SPlatten as @JonB has already written QJsonDocument::toJson() returns a QByteArray not as QString.

                      You have to send and read the same thing if you want it to work!

                      void clsModFileIO::onDataIn() {
                          QDataStream dsIn;
                          dsIn.setDevice(this);
                          dsIn.setVersion(clsJSON::mscintQtVersion);
                      
                          QByteArray jsonArray;
                          dsIn.startTransaction();
                          dsIn >> jsonArray;
                      
                          QJsonDocument doc;
                          if ( jsonArray.isEmpty() != true ) {
                              qdbg() << "onDataIn: " << jsonArray;
                              doc = QJsonDocument::fromJson(jsonArray);
                          }
                          if ( dsIn.commitTransaction() == false ) {
                              return;
                          }
                      }
                      

                      [EDIT] This only works if you also change the send:

                      void clsModHelper::sendJSON(QJsonObject& objJSON) {
                          if ( isOpen() != true ) {
                              return;
                          }
                          //Associate this TCP socket with the output data stream
                          QDataStream dsOut;
                          dsOut.setDevice(this);
                          dsOut.setVersion(clsJSON::mscintQtVersion);
                          //Send message to data stream
                          dsOut << QJsonDocument(objJSON).toJson(QJsonDocument::Compact);
                      }
                      
                      SPlattenS Offline
                      SPlattenS Offline
                      SPlatten
                      wrote on last edited by SPlatten
                      #23
                      This post is deleted!
                      1 Reply Last reply
                      0
                      • KroMignonK KroMignon

                        @SPlatten as @JonB has already written QJsonDocument::toJson() returns a QByteArray not as QString.

                        You have to send and read the same thing if you want it to work!

                        void clsModFileIO::onDataIn() {
                            QDataStream dsIn;
                            dsIn.setDevice(this);
                            dsIn.setVersion(clsJSON::mscintQtVersion);
                        
                            QByteArray jsonArray;
                            dsIn.startTransaction();
                            dsIn >> jsonArray;
                        
                            QJsonDocument doc;
                            if ( jsonArray.isEmpty() != true ) {
                                qdbg() << "onDataIn: " << jsonArray;
                                doc = QJsonDocument::fromJson(jsonArray);
                            }
                            if ( dsIn.commitTransaction() == false ) {
                                return;
                            }
                        }
                        

                        [EDIT] This only works if you also change the send:

                        void clsModHelper::sendJSON(QJsonObject& objJSON) {
                            if ( isOpen() != true ) {
                                return;
                            }
                            //Associate this TCP socket with the output data stream
                            QDataStream dsOut;
                            dsOut.setDevice(this);
                            dsOut.setVersion(clsJSON::mscintQtVersion);
                            //Send message to data stream
                            dsOut << QJsonDocument(objJSON).toJson(QJsonDocument::Compact);
                        }
                        
                        SPlattenS Offline
                        SPlattenS Offline
                        SPlatten
                        wrote on last edited by
                        #24

                        @KroMignon , thank you, now its working!

                        1 Reply Last reply
                        0

                        • Login

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • Users
                        • Groups
                        • Search
                        • Get Qt Extensions
                        • Unsolved