Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "FenServeur.h"
- //-----------------
- // constructeur
- //-----------------
- FenServeur::FenServeur()
- {
- // Création et disposition des widgets de la fenêtre
- etatServeur = new QLabel;
- boutonQuitter = new QPushButton(tr("Quitter"));
- connect(boutonQuitter, SIGNAL(clicked()), qApp, SLOT(quit()));
- QVBoxLayout *layout = new QVBoxLayout;
- layout->addWidget(etatServeur);
- layout->addWidget(boutonQuitter);
- setLayout(layout);
- setWindowTitle(tr("ZeroChat - Serveur"));
- // Gestion du serveur [test si le serveur peux démarer]
- serveur = new QTcpServer(this);
- if (!serveur->listen(QHostAddress::Any, 23)) // Démarrage du serveur sur toutes les IP disponibles et sur le port 50585
- {
- // Si le serveur n'a pas été démarré correctement
- etatServeur->setText(tr("Le serveur n'a pas pu être démarré. Raison :<br />") + serveur->errorString());
- }
- else
- {
- // Si le serveur a été démarré correctement
- 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."));
- connect(serveur, SIGNAL(newConnection()), this, SLOT(nouvelleConnexion()));
- }
- tailleMessage = 0;
- }
- // -------------------------------------------
- //lors d'une nouvelle conection du client
- // -------------------------------------------
- void FenServeur::nouvelleConnexion()
- {
- envoyerATous("SYSTEM </em>Un nouveau client vient de se connecter</em>");
- QTcpSocket *nouveauClient = serveur->nextPendingConnection();
- clients << nouveauClient;
- connect(nouveauClient, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
- connect(nouveauClient, SIGNAL(disconnected()), this, SLOT(deconnexionClient()));
- }
- // -------------------------------------------
- //donnée reçue
- // -------------------------------------------
- void FenServeur::donneesRecues()
- {
- // 1 : on reçoit un paquet (ou un sous-paquet) d'un des clients
- // On détermine quel client envoie le message (recherche du QTcpSocket du client)
- QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
- if (socket == 0) // Si par hasard on n'a pas trouvé le client à l'origine du signal, on arrête la méthode
- return;
- // Si tout va bien, on continue : on récupère le message
- QDataStream in(socket);
- if (tailleMessage == 0) // Si on ne connaît pas encore la taille du message, on essaie de la récupérer
- {
- if (socket->bytesAvailable() < (int)sizeof(quint16)) // On n'a pas reçu la taille du message en entier
- return;
- in >> tailleMessage; // Si on a reçu la taille du message en entier, on la récupère
- }
- // Si on connaît la taille du message, on vérifie si on a reçu le message en entier
- if (socket->bytesAvailable() < tailleMessage) // Si on n'a pas encore tout reçu, on arrête la méthode
- return;
- // Si ces lignes s'exécutent, c'est qu'on a reçu tout le message : on peut le récupérer !
- QString message;
- in >> message;
- // 2 : on renvoie le message à tous les clients
- envoyerATous(message);
- // 3 : remise de la taille du message à 0 pour permettre la réception des futurs messages
- tailleMessage = 0;
- }
- //-----------------------------------------
- // deconnection client
- //-----------------------------------------
- void FenServeur::deconnexionClient()
- {
- envoyerATous(tr("SYSTEM <em>Un client vient de se déconnecter</em>"));
- // On détermine quel client se déconnecte
- QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
- if (socket == 0) // Si par hasard on n'a pas trouvé le client à l'origine du signal, on arrête la méthode
- return;
- clients.removeOne(socket);
- socket->deleteLater();
- }
- //----------------
- //envoyer a tous
- //----------------
- void FenServeur::envoyerATous(const QString &message)
- {
- // Préparation du paquet
- QByteArray paquet;
- QDataStream out(&paquet, QIODevice::WriteOnly);
- out << (quint16) 0; // On écrit 0 au début du paquet pour réserver la place pour écrire la taille
- QStringList split=message.split(" ");
- qDebug()<< split[0];
- if (split[0] != "SYSTEM")
- {
- out << "AFFICHAGE_TEXT" << message; // On ajoute le message à la suite
- }else
- {
- out << message;
- }
- out.device()->seek(0); // On se replace au début du paquet
- out << (quint16) (paquet.size() - sizeof(quint16)); // On écrase le 0 qu'on avait réservé par la longueur du message
- // Envoi du paquet préparé à tous les clients connectés au serveur
- for (int i = 0; i < clients.size(); i++)
- {
- clients[i]->write(paquet);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement