Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.79 KB | None | 0 0
  1. #include "FenServeur.h"
  2. //-----------------
  3. //  constructeur
  4. //-----------------
  5. FenServeur::FenServeur()
  6. {
  7.     // Création et disposition des widgets de la fenêtre
  8.     etatServeur = new QLabel;
  9.     boutonQuitter = new QPushButton(tr("Quitter"));
  10.     connect(boutonQuitter, SIGNAL(clicked()), qApp, SLOT(quit()));
  11.  
  12.     QVBoxLayout *layout = new QVBoxLayout;
  13.     layout->addWidget(etatServeur);
  14.     layout->addWidget(boutonQuitter);
  15.     setLayout(layout);
  16.  
  17.     setWindowTitle(tr("ZeroChat - Serveur"));
  18.  
  19.     // Gestion du serveur [test si le serveur peux démarer]
  20.     serveur = new QTcpServer(this);
  21.     if (!serveur->listen(QHostAddress::Any, 23)) // Démarrage du serveur sur toutes les IP disponibles et sur le port 50585
  22.     {
  23.         // Si le serveur n'a pas été démarré correctement
  24.         etatServeur->setText(tr("Le serveur n'a pas pu être démarré. Raison :<br />") + serveur->errorString());
  25.     }
  26.     else
  27.     {
  28.         // Si le serveur a été démarré correctement
  29.         etatServeur->setText(tr("Le serveur a été démarré sur le port <strong>") + QString::number(serveur->serverPort()) + tr("</strong>.<br />Des clients peuvent maintenant se connecter."));
  30.         connect(serveur, SIGNAL(newConnection()), this, SLOT(nouvelleConnexion()));
  31.     }
  32.  
  33.     tailleMessage = 0;
  34. }
  35. // -------------------------------------------
  36. //lors d'une nouvelle conection du client
  37. // -------------------------------------------
  38. void FenServeur::nouvelleConnexion()
  39. {
  40.     envoyerATous("SYSTEM </em>Un nouveau client vient de se connecter</em>");
  41.  
  42.     QTcpSocket *nouveauClient = serveur->nextPendingConnection();
  43.     clients << nouveauClient;
  44.  
  45.     connect(nouveauClient, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
  46.     connect(nouveauClient, SIGNAL(disconnected()), this, SLOT(deconnexionClient()));
  47. }
  48. // -------------------------------------------
  49. //donnée reçue
  50. // -------------------------------------------
  51. void FenServeur::donneesRecues()
  52. {
  53.     // 1 : on reçoit un paquet (ou un sous-paquet) d'un des clients
  54.  
  55.     // On détermine quel client envoie le message (recherche du QTcpSocket du client)
  56.     QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
  57.     if (socket == 0) // Si par hasard on n'a pas trouvé le client à l'origine du signal, on arrête la méthode
  58.         return;
  59.  
  60.     // Si tout va bien, on continue : on récupère le message
  61.     QDataStream in(socket);
  62.  
  63.     if (tailleMessage == 0) // Si on ne connaît pas encore la taille du message, on essaie de la récupérer
  64.     {
  65.         if (socket->bytesAvailable() < (int)sizeof(quint16)) // On n'a pas reçu la taille du message en entier
  66.              return;
  67.  
  68.         in >> tailleMessage; // Si on a reçu la taille du message en entier, on la récupère
  69.     }
  70.  
  71.     // Si on connaît la taille du message, on vérifie si on a reçu le message en entier
  72.     if (socket->bytesAvailable() < tailleMessage) // Si on n'a pas encore tout reçu, on arrête la méthode
  73.         return;
  74.  
  75.  
  76.     // Si ces lignes s'exécutent, c'est qu'on a reçu tout le message : on peut le récupérer !
  77.     QString message;
  78.     in >> message;
  79.  
  80.  
  81.     // 2 : on renvoie le message à tous les clients
  82.     envoyerATous(message);
  83.  
  84.     // 3 : remise de la taille du message à 0 pour permettre la réception des futurs messages
  85.     tailleMessage = 0;
  86. }
  87. //-----------------------------------------
  88. //          deconnection client
  89. //-----------------------------------------
  90. void FenServeur::deconnexionClient()
  91. {
  92.     envoyerATous(tr("SYSTEM <em>Un client vient de se déconnecter</em>"));
  93.  
  94.     // On détermine quel client se déconnecte
  95.     QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
  96.     if (socket == 0) // Si par hasard on n'a pas trouvé le client à l'origine du signal, on arrête la méthode
  97.         return;
  98.  
  99.     clients.removeOne(socket);
  100.  
  101.     socket->deleteLater();
  102. }
  103. //----------------
  104. //envoyer a tous
  105. //----------------
  106. void FenServeur::envoyerATous(const QString &message)
  107. {
  108.     // Préparation du paquet
  109.     QByteArray paquet;
  110.     QDataStream out(&paquet, QIODevice::WriteOnly);
  111.  
  112.     out << (quint16) 0; // On écrit 0 au début du paquet pour réserver la place pour écrire la taille
  113.  
  114.  
  115.     QStringList split=message.split(" ");
  116.     qDebug()<< split[0];
  117.     if (split[0] != "SYSTEM")
  118.     {
  119.         out << "AFFICHAGE_TEXT" << message; // On ajoute le message à la suite
  120.     }else
  121.     {
  122.        out << message;
  123.     }
  124.  
  125.     out.device()->seek(0); // On se replace au début du paquet
  126.     out << (quint16) (paquet.size() - sizeof(quint16)); // On écrase le 0 qu'on avait réservé par la longueur du message
  127.  
  128.  
  129.     // Envoi du paquet préparé à tous les clients connectés au serveur
  130.     for (int i = 0; i < clients.size(); i++)
  131.     {
  132.         clients[i]->write(paquet);
  133.     }
  134.  
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement