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)
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
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 ;*/ }
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(); }
Partager