Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoi d'un objet par le réseau [Qt]

    14 avril 2018 à 15:39:20

    Bonjour, alors je m'explique, je voudrais pouvoir envoyer un tableau de type QVector du serveur au client. 

    Je ne trouve pas de solution, merci de votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 avril 2018 à 11:37:12

      Difficile de donner des explications sans détail du problème. D'abord savoir que tu envoies un QVector ne sert pas à grand chose. Par contre le type de ce QVector aurait été apprécié.

      Qu'utilises-tu pour créer ton serveur ? QTcpServer ? Si c'est le cas, je vois pas le soucis d'utiliser la méthode write d'un socket (QTcpSocket)...

      Bref avec beaucoup plus de précisions on pourra sans doute plus t'aider.

      • Partager sur Facebook
      • Partager sur Twitter
        15 avril 2018 à 11:47:22

        Oui désolé, je vais m'expliquer en détails.

        J'ai un QVector de type QDirModel, que je voudrais envoyer aux clients mais il y a un problème de convertion et au final le client ne reçoit rien.

        Mon serveur est un QTcpServer.

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 avril 2018 à 13:01:04

          Avec quelle méthode utilises-tu cet objet QDirModel ?
          • Partager sur Facebook
          • Partager sur Twitter
            15 avril 2018 à 15:47:05

            Je n'ai pas très bien compris la question.. Tu veux dire avec quoi elle est lié ? 

            Ce que je fais avec mon QDirModel : 

            QDirModel model = new QDirModel();
            QTreeView vue = new QTreeView();
            vue.setModel(model);


             

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 avril 2018 à 20:37:42

              Comment envoies-tu via ton socket ton objet model ?
              • Partager sur Facebook
              • Partager sur Twitter
                15 avril 2018 à 21:20:25

                Salut,

                thenightfire a écrit:

                Je n'ai pas très bien compris la question.. Tu veux dire avec quoi elle est lié ? 

                Ce que je fais avec mon QDirModel : 

                QDirModel model = new QDirModel();
                QTreeView vue = new QTreeView();
                vue.setModel(model); 

                Ce code ne compilera déjà pas pour plusieurs raisons... à moins qu'il ne s'agisse d'erreur de copie

                Pourrais tu nous donner le code complet que tu utilises?

                • Partager sur Facebook
                • Partager sur Twitter
                Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                Anonyme
                  15 avril 2018 à 21:48:25

                  koala01 a écrit:

                  Ce code ne compilera déjà pas pour plusieurs raisons... à moins qu'il ne s'agisse d'erreur de copie

                  Pourquoi ? Pour l'instance manquante ? Si oui, je ne pense pas que ça vienne de là, si ?

                  EDIT: C'est la seule raison que je vois

                  -
                  Edité par Anonyme 15 avril 2018 à 21:49:16

                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 avril 2018 à 22:57:25

                    Moi, je vois personnellement plusieurs raisons pour lesquelles ce code de trois lignes ne compilerait pas:
                    QDirModel model = new QDirModel();

                    définition d'une valeur à laquelle on essaye d'assigner un pointeur.

                    Soit on définit une valeur, soit on définit un pointeur, mais il faut choisir

                    QTreeView vue = new QTreeView();

                    Pareil, même cause, mêmes effet...

                    vue.setModel(model);

                    De deux choses l'une:

                    soit vue est une valeur, mais il ne fallait pas  utiliser new à la ligne 2, soit la syntaxe correcte pour accéder à un pointeur serait vue->setModel

                    En plus, setModel s'attend à obtenir un pointeur sur le model.  Si on a choisi de définir model en tant que valeur, on a tout faux, car vue va devenir le widget parent de model, et essayera donc de le détruire lorsqu'il sera lui-même détruit. Ce qui ne pourra se faire que si model a été créé en ayant recours à l'allocation dynamique de la mémoire.


                    • Partager sur Facebook
                    • Partager sur Twitter
                    Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                    Anonyme
                      16 avril 2018 à 6:06:41

                      Arf oui le pointeur comment j'ai pu zapper ça...

                      Bien vu, mais je pense que ça reste une erreur de copie, le message d'erreur resterait assez clair pour resoudre facilement.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 avril 2018 à 10:34:35

                        En plus, je suis quasiment sur que ce code cache au moins une variable de classe avec une variable locale à la fonction dans laquelle elle se trouve.

                        C'est la raison pour laquelle je demande le code complet de la classe ;)

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                          18 avril 2018 à 10:12:10

                          Oui le pointeur c'était une erreur de copie, désolé.

                          Voici le code du serveur : 

                          #ifndef FENSHAREUSB_H
                          #define FENSHAREUSB_H
                          
                          #include <QMainWindow>
                          #include <QDirModel>
                          #include <QList>
                          #include <QtNetwork/QtNetwork>
                          
                          
                          namespace Ui {
                          class FenShareUsb;
                          }
                          
                          class FenShareUsb : public QMainWindow
                          {
                              Q_OBJECT
                          
                          public:
                              explicit FenShareUsb(QWidget *parent = 0);
                              ~FenShareUsb();
                          
                          
                          public slots:
                              void setDisque();
                              void nouvelleConnexion();
                              void donneesRecues();
                              void envoyerDonnees();
                          
                          private:
                              Ui::FenShareUsb *ui;
                              QDirModel *modele;
                              QTcpServer *serveur;
                              QList <QTcpSocket *>clients;
                              QString indexRecu;
                              quint16 tailleMessage;
                          
                          };
                          
                          #endif // FENSHAREUSB_H
                          

                          Le .cpp :

                          #include "FenShareUsb.h"
                          #include "ui_FenShareUsb.h"
                          
                          FenShareUsb::FenShareUsb(QWidget *parent) :
                              QMainWindow(parent),
                              ui(new Ui::FenShareUsb)
                          {
                              ui->setupUi(this);
                              modele = new QDirModel;
                              ui->disque->setModel(modele);
                              setDisque();
                          
                              connect(ui->disque, SIGNAL(currentTextChanged(QString)), this, SLOT(setDisque()));
                          
                          
                              serveur = new QTcpServer(this);
                              if (!serveur->listen(QHostAddress::Any, 50885)) 
                                  {
                                      qWarning("Serveur Non Démmarer");
                                  }
                                  else
                                  {
                                      qWarning("Serveur Démmarer");
                                      connect(serveur, SIGNAL(newConnection()), this, SLOT(nouvelleConnexion()));
                                      connect(ui->partager, &QPushButton::clicked, this, &FenShareUsb::envoyerDonnees);
                                  }
                              indexRecu = "0";
                              ui->donnees->setText(indexRecu);
                              tailleMessage = 0;
                          }
                          
                          FenShareUsb::~FenShareUsb()
                          {
                              delete ui;
                          }
                          
                          void FenShareUsb::setDisque()
                          {
                              ui->disqueChoisi->setText(ui->disque->currentText());
                          }
                          
                          void FenShareUsb::nouvelleConnexion()
                          {
                          
                              QTcpSocket *nouveauClient = serveur->nextPendingConnection();
                          
                              clients << nouveauClient;
                          
                              connect(nouveauClient, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
                          
                              qWarning("nouveau client");
                          }
                          
                          void FenShareUsb::donneesRecues()
                          {
                              QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
                          
                              if (socket == 0) 
                                      return;
                          
                              QDataStream in(socket);
                          
                              if (tailleMessage == 0) 
                                  {
                                      if (socket->bytesAvailable() < (int)sizeof(quint16)) 
                                           return;
                          
                                      in >> tailleMessage; 
                                  }
                          
                                  
                                  if (socket->bytesAvailable() < tailleMessage) 
                                      return;
                          
                              QString message;
                              in >> message;
                          
                              ui->donnees->setText(message);
                          
                              tailleMessage = 0;
                          }
                          
                          void FenShareUsb::envoyerDonnees()
                          {
                              QByteArray paquet;
                              QDataStream out(&paquet, QIODevice::WriteOnly);
                          
                              
                          
                              out << (quint16) 0;
                              out << modele;
                              out.device()->seek(0);
                              out << (quint16) (paquet.size() - sizeof(quint16));
                          
                              for (int i = 0; i < clients.size(); i++)
                                  {
                                      clients[i]->write(paquet);
                                  }
                              qWarning("Texte envoyer");
                          }
                          

                          le code du client :

                          #ifndef FENCLIENT_H
                          #define FENCLIENT_H
                          
                          #include <QWidget>
                          #include <QPushButton>
                          #include <QTreeView>
                          #include <QGridLayout>
                          #include <QDirModel>
                          #include <QLabel>
                          #include <QtNetwork/QtNetwork>
                          
                          namespace Ui {
                          class FenClient;
                          }
                          
                          class FenClient : public QWidget
                          {
                              Q_OBJECT
                          
                          public:
                              explicit FenClient(QWidget *parent = 0);
                              ~FenClient();
                          
                          
                          public slots:
                              void boutonConnexionClick();
                              void boutonEnvoyerClick();
                              void donneesRecu();
                          
                          private:
                              Ui::FenClient *ui;
                              QPushButton *envoyer;
                              QPushButton *connexion;
                              QTcpSocket *socket;
                              QTreeView *vueDisque;
                              QGridLayout *layout;
                              QLabel *message;
                              quint16 tailleMessage;
                          };
                          
                          #endif // FENCLIENT_H
                          

                          Le .cpp du client :

                          #include "fenclient.h"
                          #include "ui_fenclient.h"
                          
                          FenClient::FenClient(QWidget *parent) :
                              QWidget(parent),
                              ui(new Ui::FenClient)
                          {
                          
                              ui->setupUi(this);
                              socket = new QTcpSocket();
                              vueDisque = new QTreeView();
                              connexion = new QPushButton("Connexion");
                              envoyer = new QPushButton("Envoyer");
                              message = new QLabel();
                          
                              vueDisque->setVisible(false);
                          
                              layout = new QGridLayout();
                              layout->addWidget(vueDisque, 1, 0);
                              layout->addWidget(connexion, 0, 0);
                              layout->addWidget(envoyer, 0, 1);
                              layout->addWidget(message, 0, 2);
                          
                              connect(connexion, &QPushButton::clicked, this, &FenClient::boutonConnexionClick);
                              connect(envoyer, &QPushButton::clicked, this, &FenClient::boutonEnvoyerClick);
                              connect(socket, &QTcpSocket::readyRead, this, &FenClient::donneesRecu);
                          
                              tailleMessage = 0;
                              setLayout(layout);
                          }
                          
                          FenClient::~FenClient()
                          {
                              delete ui;
                          }
                          
                          void FenClient::boutonConnexionClick()
                          {
                              socket->connectToHost("127.0.0.1", 50885);
                          
                          
                          }
                          
                          void FenClient::boutonEnvoyerClick()
                          {
                              QByteArray paquet;
                              QDataStream out(&paquet, QIODevice::WriteOnly);
                          
                              QString message = "Cool";
                          
                              out << (quint16) 0;
                              out << message;
                              out.device()->seek(0);
                              out << (quint16) (paquet.size() - sizeof(
                                                    quint16));
                          
                              socket->write(paquet);
                              qWarning("Texte envoyer");
                          }
                          
                          void FenClient::donneesRecu()
                          {
                              QDataStream in(socket);
                          
                              if (tailleMessage == 0) 
                                  {
                                      if (socket->bytesAvailable() < (int)sizeof(quint16)) 
                                           return;
                          
                                      in >> tailleMessage; 
                                  }
                              
                                  if (socket->bytesAvailable() < tailleMessage) 
                                      return;
                          
                              QDirModel modele = new QDirModel;
                              in >> modele;
                          
                              vueDisque->setModel(modele);
                          
                              tailleMessage = 0;
                          }
                          

                          Voilà. Merci votre aide.




                          • Partager sur Facebook
                          • Partager sur Twitter

                          Envoi d'un objet par le réseau [Qt]

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown