Bonjour,
Je pense que je trouverais un bout d'aide par ici. J'ai une question précise auquel malgré mes recherches, je n'ai pas trouvé de réponse.
J'aimerais me connecter à un serveur de tchat. Mettons celui d'épiknet. C'est plus par ce que je connais le serveur que je le cite, sinon, on considérera qu'au final je pourrait me connecter à n'importe quel serveur de t'chat ayant ce protocole de type IRC.
Vous avez surement compris que le but est de faire un client IRC. C'est le but en effet de cet exercice que je me suis imposé. J'ai composé au départ seul, puis avec un peu d'aide une interface me permettant de visualiser le retour serveur et uniquement celui-ci. Dans un premier temps, je ne désire pas aller dans le moindre salon, mais j'aimerais tester la connexion et déconnexion.
Et c'est là ou je veux en venir ! Comment se connecter ? J'ai entendu parlé et j'ai été vérifier que QIODevice permettait de faire ça dans Qt. Alors, tout content, j'ai googoliser un peu. Et puis... pas grand chose ! On y parle souvent de réseau locaux ou de fichier. Pas de t'chat ! Pour la petite histoire, par ce que j'aime bien garder mes sources dans ce que je dit, je vous met là, le bout de doc que j'ai trouver. Cela permettra de partir avec la même base : http://qt-project.org/doc/qt-5.1/qtcore/qiodevice.html
Maintenant, je me pose cette question. Je connais déjà l'adresse irc.epiknet.org et le port 6667. Je suis bien avancer avec ça ! Alors, sur un coin de table j'ai écrit ce petit algorithme. Enfin pseudo code si vous préférez.
Avant d'aller plus loin, je dois vous avouer qu'en plus il me faut voir le retour serveur. Cela se produit quand le serveur, à la connexion dit bonjour et qu'il donne son laïus. Cela sera dans le QTextEdit. Et je vous montre quand même le code qui a déjà été saisie et qui fonctionne parfaitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 //Bouton Connexion //Start //QString adresse = "irc.epiknet.org"; //int port = 6667; //Lancer la connexion (adresse, port); //Stop //Bouton Deconnexion //Start //Couper la connexion //Stop
J'ai bien conscience qu'à ce stade il manque les écouteurs (signal et slot) et pour les test c'étais voulue. D'ailleurs, je vais essayer de les implémenter sous peu. Il faudra peut-être, surement commencer par la ?
Déjà, de prime abord, le main.cpp
Oui, donc pas de quoi révolutionner mais pour s'y retrouver dans nos explications, on s'y référera ! Ainsi, si vous me dites qu'il faille opéré dans le main.cpp, j'irais pas cherché dans tondeuse.h et vise versa.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
Et maintenant le mainwindow.h
Les choses se précise, on sait maintenant ce que fais la fenêtre mais c'est pas tout ! A ce stade du projet, je doit penser évolutivité. La fenêtre tel que sera modifié pour les versions suivantes. En effet, je n'affiche volontairement qu'un QTextEdit... Il faudra bien saisir quelque-part, gérer les canneaux... C'est vers cela que je tendrais au travers de l'emploie de tread ensuite. Un tread par onglet, ou du moins, un onglet par tread. Voyez comme vous le voulez !
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 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE class QTextEdit; class QPushButton; class QGridLayout; QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: QTextEdit *textEdit; QPushButton *connexionButton; QPushButton *deconnexionButton; }; #endif // MAINWINDOW_H
En attendant, voila le mainwindow.cpp
C'est ici que tout ce passe au niveau graphique. Ok, et ça fonctionne très bien. Je suis pour la séparation des datas (issue du serveur au travers de la connexion) comme celle de la saisie opérateur. Et d'ailleurs, c'est le but au final. Faire que tout communique ensemble sans que tout paraisse imbriqué bêtement !
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 #include "mainwindow.h" #include <QTextEdit> #include <QGridLayout> #include <QPushButton> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { textEdit = new QTextEdit; textEdit->setText(""); textEdit->setReadOnly(true); connexionButton = new QPushButton; connexionButton->setText("Connexion"); deconnexionButton = new QPushButton; deconnexionButton->setText("Déconnexion"); QGridLayout *gridLayout = new QGridLayout; gridLayout->addWidget(textEdit, 0, 0, 1, 2); gridLayout->addWidget(connexionButton, 1, 0); gridLayout->addWidget(deconnexionButton, 1, 1); QWidget *centraleWidget = new QWidget; centraleWidget->setLayout(gridLayout); setCentralWidget(centraleWidget); } MainWindow::~MainWindow() { }
Alors, vue que j'ai répondu a beaucoup de mes questions, vous êtes en droit de penser :"pourquoi donc il nous en expose un patacaisse, il veut un t'chat point.". Oui, vous avez raison ! Je veux mon t'chat a moi ! Mais je cherche avant tout à comprendre ce qui se passe au niveau du mécanisme employé. Et plus précisément niveau code et réseaux.
Pour moi l'enjeu de la compréhension prime devant celui de réussir ou de raté un code. Et c'est bien là une de mes caractéristiques favorites. Alors ma question est finalement. Par quel bout prendre ce que je veux faire ?
Fait-il faire les signals et slot d'abord ?
Comment est-ce que l'on établi la connexion avec le serveur ?
Pour se connecter quel est le code minimal utilisant QIODevice ?
Faut-il sécurisé ? Si oui, comment ? Est-ce que ça peut se faire après une connexion réussi ?
J'aimerais au final avoir la capacité de joindre plusieurs serveur (cas ou je gèrerais la connexion à deux, trois serveur aux noms et ports différents. Il faudra surement que je face de l'option. Je gèrerais ça après. Mais on peut déjà penser à la façon de procédé même si, dans un premier temps on se base sur une const int port = "6667";...
Pour l'heure, je cherche, j'expérimente, n'ayez pas peur de me dire qu'il faille revoir une partie du code. Cet exemple est fait pour ça.
Merci de votre attention.![]()
Partager