IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau Discussion :

Connexion et utilisation de ​QIODevice


Sujet :

Réseau

  1. #1
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut Connexion et utilisation de ​QIODevice
    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.

    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
    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.

    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
    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();
    }
    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.

    Et maintenant le mainwindow.h
    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
    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 !

    En attendant, voila le mainwindow.cpp
    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()
    {
     
    }
    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 !

    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.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut


    Je dois bien avouer ne pas avoir tout lu .

    Si on parle si souvent de réseau dans QIODevice, c'est qu'il s'agit plutôt d'une interface : tu peux manipuler de la même manière un fichier ou un socket TCP. Pour aller sur le réseau, il faut regarder dans la hiérarchie de QIODevice, plutôt dans le module Qt Network : http://qt-project.org/doc/qt-5.1/qtn...tcpsocket.html ou http://qt-project.org/doc/qt-5.1/qtn...udpsocket.html. Avec ces classes, tu pourras envoyer des données sur le réseau à un processus donné. Il te faut encore implémenter le protocole IRC par-dessus. Pour cette partie, il faut te plonger dans les spécifications (par exemple, http://www.irchelp.org/irchelp/rfc/rfc.html). Un petit tutoriel sur TCP : http://qt.developpez.com/tutoriels/reseau/.

    Plus pour être complet que pour aider dans le cas précis, QNetworkAccessManager http://qt-project.org/doc/qt-5.1/qtn...ssmanager.html est la manière préférée d'effectuer des actions sur le réseau : il s'agit d'une implémentation côté client de HTTP et FTP, entièrement asynchrone, d'assez haut niveau. C'est mieux que de trifouiller dans les paquets HTTP et commencer à étriper les concepteurs du chunked encoding . Cette série de classes est traitée dans http://tcuvelier.developpez.com/tuto...elechargement/.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut


    Je dois avouer que je voulais de la doc et décortiquer ce qui n'est, pour moi et pour le moment, qu'un cheminement. Je suis servi.



    Je vais étudier tout ça de prêt et, dans la mesure de mes moyens m'en inspirer pour réaliser un début de connexion et de réponse dans la fenêtre. Si déjà un serveur me répond "hello-world" ou plus précisément que la connexion n'a pas échouer, alors je serais content d'aller plus loin.

    Pas de souci pour le protocole IRC, j'ai déjà commencer à lire un peu en FR en plus

    Là, ou je m'inquiète, c'est plus la façon dont je vais pouvoir implémenter la connexion. Je pencherais déjà par les commandes et une classe qui la gère.

    Mettons par exemple une classe chat.h et chat.cpp. Dedans je ferrais appel à QIODevice et tout ce dont nous venons de parler.

    Il faudra surement une classe tread.h et tread.cpp qui gèrera les onglets et les treads.

    Enfin, il faudra que je place un menu et que je gère des boites de dialogues (non modale pour les treads et modale pour le reste du solft), ou voir pas du tout !

    Pour le fun, et par ce que j'aime bien aussi parler de cheminement, ce c'est pas bien de ne pas tous lire En fait, j'ai fait expret. C'est plus sympas que "bonjour, je pose mon ragnagna; on me répond; j'me barre sans le petit résolu...". Oui, c'est un peu plus étoffé et ça permet de garder une trace du projet. Pour infos, je n'ai pas abandonner le reste. J'y reviendrais. Mais cet exercice pourrait bien devenir un programme lui-même.

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    Ne confonds pas fichiers et classe : tu peux très bien avoir quinze classes différentes déclarées et implémentées dans un même fichier… ou avoir l'implémentation d'une même classe répartie dans quinze fichiers.

    L'idéal serait d'avoir une classe (ou un paquet, peu importe, il faut voir selon le protocole ce qui convient le mieux – or, je ne connais absolument pas IRC ) qui gère entièrement le protocole IRC, dont les seules dépendances seraient Qt Core et Qt Network, rien d'autre, pas un mot sur les interfaces graphiques : prévoir la classe comme si elle devait aussi fonctionner en console ou dans une application Web. L'interface utilise alors cette classe.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre éclairé Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Par défaut
    J'avance petit à petit !

    Alors, là, j'ai ajouter #include <QIODevice>. Il est censé contenit QTcpSocket... et euh.. il n'en est rien !

    Résultat, impossible d'utiliser QTcpSocket car si je le met en include, il ne trouve pas le chemin

    Du coup la aussi, je suis coincé

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 754
    Par défaut
    QIODevice n'est pas censé contenir QTcpSocket . QIODevice fait partie de Qt Core, QTcpSocket de Qt Network : deux modules différents, indépendants. L'une hérite de l'autre, mais ça ne veut pas dire que tous les enfants d'une classe sont accessibles en incluant juste l'en-tête de la mère. (Je n'ai pas en tête un seul environnement qui permette ne fut-ce que déterminer tous les enfants d'une classe.)

    As-tu ajouté le module Qt Network au fichier de projet ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

Discussions similaires

  1. Problème de connexion en utilisant 2 fichiers (Access)
    Par kroma23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/11/2008, 13h32
  2. [DataSource] probléme de connexion en utilisant le context
    Par sajedose dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 04/04/2008, 14h42
  3. connexion socket utilisant des threads
    Par alceste dans le forum C++
    Réponses: 16
    Dernier message: 14/10/2006, 12h00
  4. Réponses: 18
    Dernier message: 16/02/2006, 10h08
  5. Réponses: 2
    Dernier message: 07/02/2006, 08h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo