IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau Discussion :

Envoi d'une image d'un client vers le serveur


Sujet :

Réseau

  1. #1
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 212
    Points : 93
    Points
    93
    Par défaut Envoi d'une image d'un client vers le serveur
    Bonjour à tous,

    j'aurais besoin d'un petit coup de main en Qt (5.2), je tiens à préciser que je suis débutante, je m'excuse donc par avance si l'erreur est évidente.
    Pour remettre le projet dans le contexte, j'essaie d'envoyer une image de mon client vers un serveur. J'ai donc coder la connexion qui s'effectue sans soucie (voir code). L'envoi s'effectue bien, mais l'image n'est pas réellement envoyée ! en effet si je fais un qDebug sur la variable que j'envoi (ligne 50, mon client), celle ci contient " ? ->" ... que ce soit côté client ou serveur (ce qui me rassure sur l'envoi des données). Je tiens à préciser 2 éléments :
    - je me suis penchée sur le problème de la taille de l'image, pour le moment celle ci est de 1.4Ko, je ne devrais donc pas avoir de problèmes à l'envoi d'après ce que j'ai pu lire. Par la suite, je compte bien fractionner mon image en paquets afin d'être certaine de l'envoi de tout type d'image.
    - j'ai aussi testée avec l'objet QPixMap, rien ne change et je préfèrerais garder le QImage afin de ne pas être dépendante de la boucle d'évènement Qt (je ne me sers pas de la partie IHM).

    Merci pour votre attention, et si vous avez une quelconque piste, idée je suis preneuse

    ps : je ne mets pas le code du main serveur, mon objet est construit dans une boucle d'évènement.

    mon client (envoi de l'image)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #include "client.h"
     
    Client::Client()
    {
        socket = new QTcpSocket(this);
    }
     
    void Client::deconnecte()
    {
        qDebug() << "Deco serveur";
    }
     
    void Client::connectToHost(QString host)
    {
        socket->abort();
     
        socket->connectToHost(host, 8080);
        if(socket->waitForConnected(8080))
        {
            qDebug() << "connected";
            // ce que j'avais testé au début
            //writeData();
        }
        else
            qDebug() << "Not connected";
    }
     
     
    void Client::writeData( QImage image){
     
        QBuffer image_buffer;
        QImageWriter writer(&image_buffer, "PNG");
        if(!writer.write(image))
            qWarning()<<"ERROR: Unable to write image to buffer: "<<writer.errorString();
     
        QByteArray data;
        QDataStream out(&data, QIODevice::ReadWrite);
        out.setVersion(QDataStream::Qt_5_2);
        out<<(quint32)image_buffer.data().size();
     
        qDebug() << "Image size = " << image_buffer.data().size();
        qDebug() << "Data size = " << data.size();
        out<<image;
     
        socket->write(data);
        if(!socket->waitForBytesWritten())
            qWarning()<<"ERROR: Unable to send image: ";
     
        //Visualisation de ce que j'envoie
        QString s = "";
        s.append(data);
        qDebug()<<"Data = "<<s;
        qDebug()<<"Image sent";
     
        //une autre méthode trouvée que j'ai testé pour voir si l'erreur pouvait venir du code si dessous, mais aucun changement au final
       /* QByteArray paquet;
            QDataStream out(&paquet, QIODevice::ReadWrite);
               out << (quint32) 2;
                out << image;
                out.device()->seek(0);
                out << (quint32) (paquet.size() - sizeof(quint32));
                socket->write(paquet); // On envoie le paquet
                //socket->waitForBytesWritten(5000);
                quint32 test = paquet.size();
                quint32 message = (quint32) (paquet.size() - sizeof(quint32));
               qDebug() << "Taille quint32 " << sizeof(quint32);
               qDebug() << "Taille packet: " << test ;
               qDebug() << "Taille message: " << message ;*/
    }
    main du client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    int main(int argc, char *argv[])
    {
        //QCoreApplication a(argc, argv);
     
        qDebug() << "Client";
        Client c;
        //je ne peux pas indiquer l'adresse, mais la connexion s'effectue
        c.connectToHost("mon adresse");
     
        QImage image;
        //je ne peux pas mettre le chemin exacte, mais l'image semble bien chargée
        bool b = image.load("adress/test.png", "PNG");
        //la taille de mon image affichée correspond bien
        qDebug() << image.size();
        c.writeData(image);
     
        //return a.exec();
    }

    mon serveur (réception de l'image)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    #include "server.h"
    Server::Server()
    {
        server = new QTcpServer(this);
        tailleMessage = 0;
        if(!server->listen(QHostAddress::Any, 8080))
        {
            qDebug() << "Server could not start";
        }
        else
        {
            qDebug() << "Server started!";
            connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));
        }
    }
     
    void Server::newConnection()
    {
            QTcpSocket *socket = server->nextPendingConnection();
            clients << socket;
            connect(socket, SIGNAL(readyRead()), this, SLOT(InsertDataBuffer()));
            connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
            qint32 *s = new qint32;
            *s = 0;
            sockets.insert(sockets.count(),socket);
            buffers.insert(socket, buffer);
            sizes.insert(socket, s);
    }
     
    void Server::disconnected()
    {
        QTcpSocket *socket = static_cast<QTcpSocket*>(sender());
            if (socket == 0) 
                return;
            clients.removeOne(socket);
            socket->deleteLater();
    }
     
     
    void Server::InsertDataBuffer()
    {
        QTcpSocket *socket = (QTcpSocket *)sender();
        int sizesocketini = socket->size();
        qDebug() << socket->size();
        if(socket == 0)
            return;
     
        QDataStream in(socket);
        in.setVersion(QDataStream::Qt_5_2);
     
        while(socket->bytesAvailable() < sizeof(quint32))
        {
            qDebug()<<"Waiting for image size...";
            if(!socket->waitForReadyRead())
            {
                qWarning()<<"ERROR: Failed to read image size: ";
                return;
            }
        }
     
        quint32 tailleMessage;
        in>>tailleMessage;
     
        qDebug()<<"Image Size = "<<tailleMessage;
     
     
        while(socket->bytesAvailable() < tailleMessage)
        {
            qDebug()<<"Waiting for image...";
            if(!socket->waitForReadyRead())
            {
                qWarning()<<"ERROR: Failed to read image: ";
                tailleMessage = 0;
                return;
            }
        }
     
        QByteArray data;
        in>>data;
     
         QString s = "";
         s.append(data);
        qDebug()<<"Data size = "<<s;
     
        QBuffer image_buffer(&data);
        QImageReader reader(&image_buffer, "PNG");
        bool b = reader.device()->seek(0);
        qDebug() << "bool" << b;
        QImage received_image;
     
        if(!reader.read(&received_image))
        {
            qWarning()<<"ERROR: Unable to read received image from buffer: "<<reader.errorString();
            tailleMessage = 0;
            return;
        }
        tailleMessage = 0;
     
        //qDebug()<<"in size = "<<data.size();
     
    }

  2. #2
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 212
    Points : 93
    Points
    93
    Par défaut
    En cas que cette info soit utile :
    J'ai remplace l'affichage du QByteArray en faisant s.append(data.toPercentEncoding());au niveau de la ligne 50.

    Côté client j'ai un nombre incalculable de %00%00%04%89%00% ect ect
    Côté serveur je ne retrouve pas les 3 premier % dans mon data (normal ils sont dédiés à ma taille) et je retrouve bien %89 en 4eme position, par contre je ne récupère que celui-ci !! Du coup, j'ai bien un problème à la réception (ou alors la fonction d'envois ne marche pas, mais je ne crois pas trop à cette possibilité).

    J'ai aussi testé avec un QString, et j'ai le même soucis, je ne récupère qu'une partie des données.

    Je vais continué à chercher, en espérant que vous aurez aussi des idées

  3. #3
    Membre régulier
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 212
    Points : 93
    Points
    93
    Par défaut
    J'ai trouvé une alternative. Il faut simplement utiliser un Qfile pour ouvrir le fichier, et insérer le tout dans un QByteArray et le transférer (adaptation taille du message ect). Côté serveur, manipulation inverse, et ceci marche très bien !
    Si quelqu'un a tout de même une idée en QImage, je suis curieuse d'en avoir un apperçut par simple curiosité

  4. #4
    Membre émérite
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Points : 2 278
    Points
    2 278
    Par défaut
    Bonjour,

    Pour envoyer un objet QImage à ton serveur, il y a deux manières qui toutes deux dépendent de QByteArray.
    Tu as trouvé la première qui consiste à passer par QFile. L'autre possibilité est de passer par QDataStream.

    Un petit tour dans la documentation de QImage et de QDataStream te sera utile.

    Sur ce, amuse-toi bien.
    De retour, plus sportif mais toujours aussi moche.
    _____________
    Pro: Programmation en C/C++ (embarqué ou non)
    Loisir: Programmation en C++11/14/17 avec la STL ou Qt 5

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. archi client serveur: envoi d'une image (java python)
    Par samantha93 dans le forum Général Python
    Réponses: 0
    Dernier message: 19/02/2014, 14h53
  2. Java application Web : Copier Image du Poste Client vers Poste Serveur
    Par abdelmoughit007 dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 15/12/2012, 12h44
  3. Envoi d'une chaîne d'un client PHP vers un serveur en C
    Par barnabe87 dans le forum Débuter
    Réponses: 4
    Dernier message: 20/01/2011, 15h28
  4. Probleme d'envoi d'un message d'un client vers un serveur
    Par ysahel dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 12/06/2009, 17h21
  5. envoi des données d'un poste client vers le serveur
    Par ouadie99 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 11/06/2008, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo