Accueil > > > MiniChat/Server/server.cpp
QL-CHATROOM V 1.0
MiniChat/Server/server.cpp
Informations sur ce code source
Qualité ChatRoom v 1.0
Une application de chat, genre salon de chat avec un administrateur.
Programmer par C++, bibliothèque Qt architecture client/serveur.
Les sockets sont échangés entre les clients et le serveur par le protocole réseau T
Fichier : MiniChat/Server/server.cpp
Nombre de lignes : 195 lignes
Afficher ce fichier en plein écran
- /*
- Qualité ChatRoom a ChatRoom.
- Copyright (C) 2012 KHABALI Anas
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
- Contacte:
- Email: anas.khabali@gmail.com
- phone: +212676747779
- site : http://http://khabalisoft.e-monsite.com/
- */
- #include "server.h"
- #include <QTcpSocket>
- #include <QRegExp>
- ChatterBoxServer::ChatterBoxServer(QObject *parent) : QTcpServer(parent)
- {
- }
- void ChatterBoxServer::incomingConnection(int socketfd)
- {
- QTcpSocket *client = new QTcpSocket(this);
- client->setSocketDescriptor(socketfd);
- clients.insert(client);
- qDebug() << "Nouveau client de:" << client->peerAddress().toString();
- connect(client, SIGNAL(readyRead()), this, SLOT(readyRead()));
- connect(client, SIGNAL(disconnected()), this, SLOT(disconnected()));
- }
- void ChatterBoxServer::readyRead()
- {
- QTcpSocket *client = (QTcpSocket*)sender();
- while(client->canReadLine())
- {
- QString line = QString::fromUtf8(client->readLine()).trimmed();
- QRegExp meRegex("^/me:(.*)$");
- QRegExp msgPRegex("^/msgP:(.*)$");
- QRegExp bannirRegex("^/bloquer:(.*)$");
- QRegExp debloqRegex("^/debloquer:(.*)$");
- QRegExp avatarSwitchRegex("^/avatarSwitch:(.*)$");
- QRegExp statutSwitchRegex("^/statutSwitch:(.*)$");
- if(statutSwitchRegex.indexIn(line) != -1)
- {
- QStringList info = statutSwitchRegex.cap(1).split("-");
- users[client]->setStatut(info[2]);
- foreach(QTcpSocket *clt, clients)
- clt->write(QString("Serveur:" + info[0] + " à changer son statut.\n").toUtf8());
- sendUserList();
- qDebug() << "User:" << users[client]->getPseudo();
- qDebug() << "Statut changer vers" << users[client]->getStaut();
- }
- else if(avatarSwitchRegex.indexIn(line) != -1){
- QStringList info = avatarSwitchRegex.cap(1).split("-");
- users[client]->setAvatar(info[1]);
- foreach(QTcpSocket *clt, clients)
- clt->write(QString("Serveur:" + info[0] + " à changer d'avatar.\n").toUtf8());
- sendUserList();
- }
- else if(bannirRegex.indexIn(line) != -1)
- {
- QString user = bannirRegex.cap(1);
- QTcpSocket * aBannir;
- foreach(QTcpSocket *client, clients)
- if(users[client]->getPseudo().compare(user) == 0 )
- aBannir = client;
- if(!bannie.contains(aBannir))
- {
- bannie.insert(aBannir,true);
- foreach(QTcpSocket * client, clients)
- client->write(QString("/bloquer:"+user+"\n").toUtf8());
- qDebug() <<user << " bloquer";
- }
- }
- else if(debloqRegex.indexIn(line) != -1)
- {
- QString user = debloqRegex.cap(1);
- QTcpSocket * aDebloquer;
- foreach(QTcpSocket *client, clients)
- if(users[client]->getPseudo().compare(user) == 0)
- aDebloquer = client;
- if(bannie.contains(aDebloquer))
- {
- foreach(QTcpSocket * client, clients)
- client->write(QString("/debloquer:"+user+"\n").toUtf8());
- bannie.remove(aDebloquer);
- qDebug() <<user<<" debloquer";
- }
- }
- else if(meRegex.indexIn(line) != -1)
- {
- QStringList user = meRegex.cap(1).split("-");
- User *usr = new User(user[0], user[1],user[2]);
- users[client]= usr;
- foreach(QTcpSocket *client, clients)
- client->write(QString("Serveur:" + usr->getPseudo() + " est connecté.\n").toUtf8());
- sendUserList();
- }
- else if(users.contains(client) && !bannie.contains(client))
- {
- if(msgPRegex.indexIn(line) != -1)
- {
- QStringList clmsg = msgPRegex.cap(1).split("-");
- QString from = users[client]->getPseudo();
- QString too = clmsg[0];
- foreach(QTcpSocket * clt, clients)
- if ( users[clt]->getPseudo().compare(from) == 0 || users[clt]->getPseudo().compare(too) == 0 )
- clt->write(QString("/msgP:"+ from + "-" + clmsg[1] ).toUtf8() + " \n");
- qDebug() << "Message privee.";
- qDebug()<< "User:" << from ;
- qDebug() << " Message:" << clmsg[1];
- }
- else
- {
- QString message = line;
- QString user = users[client]->getPseudo();
- qDebug() << "User:" << user;
- qDebug() << "Message:" << message;
- foreach(QTcpSocket *otherClient, clients)
- if(!bannie.contains(otherClient))
- otherClient->write(QString(user + ":" + message + "\n").toUtf8());
- }
- }
- else
- {
- if(!bannie.contains(client))
- qWarning() << "Mauvais message du client:" << client->peerAddress().toString() << line;
- }
- }
- }
- void ChatterBoxServer::disconnected()
- {
- QTcpSocket *client = (QTcpSocket*)sender();
- qDebug() << "Client deconnecte:" << client->peerAddress().toString();
- clients.remove(client);
- QString user = users[client]->getPseudo();
- users.remove(client);
- if(bannie.contains(client)) bannie.remove(client);
- sendUserList();
- QString out;
- out="Serveur:" + user + " est parti. \n";
- foreach(QTcpSocket *client, clients)
- client->write(out.toUtf8());
- }
- void ChatterBoxServer::sendUserList()
- {
- QString out = "/users:";
- QStringList list;
- foreach(User *user, users.values())
- list << user->getPseudo()+"-"+user->getAvatar()+"-"+user->getStaut();
- out+= list.join(",") + "\n";
- qDebug() << "list users" << out;
- foreach(QTcpSocket *client, clients){
- client->write(out.toUtf8());
- }
- }
|