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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
   | #include "fenconnecter.h"
#include "ui_fenconnecter.h"
#include <QMessageBox>
 
 
FenConnecter::FenConnecter(QWidget *parent,int port) :
    QMainWindow(parent),
    ui(new Ui::FenConnecter)
{
 
    ui->setupUi(this);
    tailleMessage=0;
    serveur = new QTcpServer(this);
 
    if(serveur->listen(QHostAddress::Any, port)){
        QMessageBox::information(this, "Information", "Le serveur est chargé sur le port 50000", QMessageBox::Ok);
        connect(serveur, SIGNAL(newConnection()), this, SLOT(nouvelleConnexion()));
        this->close();
    }else{
        QMessageBox::critical(this,"Erreur","Le serveur n'a pu etre chargé");
    }
 
    modele = new QStandardItemModel(1, 1);
    //modele->setItem(3, 1, new QStandardItem("Zéro !"));
    ui->tableView->setModel(modele);
    //HorizontalHeader
    //ui->tableView->setHorizontalHeader();
 
 
 
}
 
FenConnecter::~FenConnecter()
{
    delete ui;
}
void FenConnecter::remplirTable(){
 
 
    modele->setItem(clients.length(), 0, new QStandardItem("Clients "+QString::number(clients.length())));
 
}
void FenConnecter::ajoutServer(QTcpServer *srv){
    serveur=srv;
     QMessageBox::information(this,"test",serveur->errorString()+" / "+ QString::number(serveur->serverPort())+" / ");
 
 
 }
 
void FenConnecter::nouvelleConnexion()
{
 
 
   QMessageBox::information(this,"test","Un nouveau client vient de se connecter");
    QTcpSocket *nouveauClient = serveur->nextPendingConnection();
    clients << nouveauClient;
    connect(nouveauClient, SIGNAL(readyRead()), this, SLOT(donneesRecues()));
    remplirTable();
    //connect(nouveauClient, SIGNAL(disconnected()), this, SLOT(deconnexionClient()));
 
}
void FenConnecter::donneesRecues()
{
    QMessageBox::information(this,"test","Données recue");
 
    // 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);
    QMessageBox::information(this,"test",QString::number(tailleMessage));
    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
    }
    QMessageBox::information(this,"test","Taille message :"+QString::number(tailleMessage));
    QMessageBox::information(this,"test","Taille du socket:"+QString::number(socket->bytesAvailable()));
    QMessageBox::information(this,"test","etape1");
    // 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;
    QMessageBox::information(this,"test","etape2");
 
    // 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;
    QMessageBox::information(this,"test","etape3");
 
 
    // 2 : on renvoie le message à tous les clients
    QMessageBox::information(this,"test","le message est : "+message);
 
    // 3 : remise de la taille du message à 0 pour permettre la réception des futurs messages
    tailleMessage = 0;
    QMessageBox::information(this,"test","etape4");
 
}
 
void FenConnecter::deconnexionClient()
{
    //envoyerATous(tr("<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();
} | 
Partager