Salut,
Je dois réaliser une application basée sur l'architecture client/serveur, le serveur sert de lien entre deux clients(ou joueurs), une fois qu'il détecte deux joueurs, il attend qu'ils soient prêts(chaque client doit envoyer 'ok' ) pour leur envoyer dix QString qui ont pour but d'initialiser des parametres chez le client . Dans la partie client j'ai un seul slot qui permet de récuperer ce que le serveur lui envoie, donc pour cela j'ai pensé à précéder l'envoie de ces 10 QString par un 'ok',ainsi le client saura que ces données servent à l'initialisation.
Dans la partie serveur, j'ai une variable global de type int qui s'incrémente à chaque fois que le serveur recoit un 'ok'.Évidemment, je fais un test à chaque incrémentation qui lance un signal si cette variable globale égale à deux. Dans ce cas, le slot associé à mon signal envoie 'ok' puis envoie dans une boucle qui tourne dix fois les QString. Ceci marche très car j'affiche ce que le serveur envoie sur la console.
Du coté du client, au niveau du slot qui permet de traiter les données recues, je mis en place un test if qui reconnait trois types de données: 'ok', les dix QString et un autre type de données. Ce test peut être représenté comme ceci: si(donnee=='ok') traitement1 sinon si(nombre des QString<10) traitement2 sinon traitement3.
J'ai pas d'erreurs de compilation, par contre le client n'arrive pas à lire les 10 QString envoyer juste après le 'ok', bien que 'ok' soit lu sans probleme.
Voila la partie de transmission du serveur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void FenServeur::envoieCoordonnees()
{
    qDebug()<<"le serveur commence l'envoie des coordonnées précédé de l'envoie de 'ok'";
    //cette fonction diffuse aux deux joueurs
    diffuserDonnee("ok");
    for(int i=0;i<10;i++)
    {
        //nombre aléatoire
        int nAl=rand()%(largeur-53);
        //conversion en QString
        QString coor=QString::number(nAl) ;
        diffuserDonnee(coor);
    }
}
Sur la console:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
"ok" 
"ok" 
"422" 
"422" 
"19" 
"19" 
"542" 
"542" 
"572" 
"572" 
"109" 
"109"
La partie de réception 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
// On a reçu un paquet (ou un sous-paquet)
void WidgetJeu::donneesRecues()
{
    /*On essaie de récupérer la taille du message
    Une fois qu'on l'a, on attend d'avoir reçu le message entier (en se basant sur la taille annoncée tailleMessage)
    */
    qDebug()<<"reception de données en cours";
    QDataStream in(socket);
    if (tailleMessage == 0)
    {
        if (socket->bytesAvailable() < (int)sizeof(quint16))
        {
            qDebug() << "Error: socket->bytesAvailable() < (int)sizeof(quint16)";
            return;
        }
        in >> tailleMessage;
    }
    if (socket->bytesAvailable() < tailleMessage)
    {
        qDebug() << "Error: socket->bytesAvailable() < tailleMessage";
        qDebug() << socket->bytesAvailable()<<" < "<<tailleMessage;
        return;
    }
    // Si on arrive jusqu'à cette ligne, on peut récupérer le message entier
    QString str;
    int messageRecu;
    in >> str;
    if(str=="ok")
    {
        qDebug()<<"c OK";
    }
    else
    {
        //cette partie n'est jamais exécutée
    }
Sur la console:
Merci d'avance.