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

Qt Discussion :

QLocalSocket et signal


Sujet :

Qt

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut QLocalSocket et signal
    Bonjour,
    J'ai écrit deux applications qui communiquent par QLocalServer/QLocalSocket. L'application cliente envoie des données dans le socket et le server les réceptionne. Tout semble bien de passer côté client mais du côté serveur le signal ReadyRead() n'est jamais lancé, comme si aucune donnée n'arrivait.

    Code du client :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
     Lecteur::Lecteur(QWidget *parent)
         : QDialog(parent)
     {
         (...)
     
         socket = new QLocalSocket(this);
     
         connect(LaunchButton, SIGNAL(clicked()),this, SLOT(connecter()));
         connect(socket, SIGNAL(connected()), this, SLOT(litEtEnvoie()));
         connect(socket, SIGNAL(error(QLocalSocket::LocalSocketError)),
                 this, SLOT(displayError(QLocalSocket::LocalSocketError)));
     
     }
     
     void Lecteur::connecter()
     {
         (...)
         socket->abort();
         socket->connectToServer("monSocket");
     }
     
     void Lecteur::litEtEnvoie()
     {
         (...)
         QByteArray block;
         QDataStream out(&block, QIODevice::WriteOnly);
         out.setVersion(QDataStream::Qt_4_0);
     
         while (! file.atEnd()) {
     
         QByteArray buffer;	
         buffer = file.readLine();
     
         out << (quint16)(buffer.size() - sizeof(quint16));
         out << buffer;
     
         socket->write(block);
     
         }
         socket->flush();
     
     }
     
    (...)
    Code du serveur :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     Ecrivain::Ecrivain(QWidget *parent)
         : QDialog(parent)
     {
         (...)
     
         server = new QLocalServer(this);
         if (!server->listen("monSocket")) {
             QMessageBox::critical(this, tr("Ecrivain"),
                                   tr("Unable to start the server: %1.")
                                   .arg(server->errorString()));
             close();
             return;
         }
     
         clientConnection = new QLocalSocket(server->nextPendingConnection());
         statusLabel->setText(tr("The server is running.\n"));
     
         connect(server, SIGNAL(newConnection()), this, SLOT(Prepare()));
         connect(clientConnection, SIGNAL(readyRead()), this, SLOT(Ecrire()));
         connect(clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater()));
     
     
         (...)
     }
     
    void Ecrivain::Prepare()
     {
      file->open(QIODevice::WriteOnly);
      QMessageBox::information(this, tr("Message"),tr("Ouverture fichier"));
      blockSize = 0;
     
       (...)  
     }
     
    void Ecrivain::Ecrire()
     {
         QMessageBox::information(this, tr("Message"),tr("Ready Read"));
     
         QDataStream in(clientConnection);
         in.setVersion(QDataStream::Qt_4_0);
         QByteArray tampon;
     
         if (blockSize == 0) {
             if (clientConnection->bytesAvailable() < (int)sizeof(quint16))
                 return;
             in >> blockSize;
             if (clientConnection->bytesAvailable() < (int)blockSize)
                 return;
             in >> tampon;
             file->write(tampon);
         }
     
         if (in.atEnd())
             return;
     
     }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    comment fais-tu tes tests ?
    je te conseille de lancer client et serveur sur le même PC et de mettre local_network (il me semble, à confirmer avec les exemples Qt) comme destinataire IP .
    Cela t'affranchira d'éventuels blocage dus à la particularité du réseau entre 2 PC distants

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    Les deux applications sont sur le même poste. Il n'y a pas d'IP ni de couche réseau avec les QLocalSocket.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par DSGSLA Voir le message
    Bonjour,
    J'ai écrit deux applications qui communiquent par QLocalServer/QLocalSocket. L'application cliente envoie des données dans le socket et le server les réceptionne. Tout semble bien de passer côté client mais du côté serveur le signal ReadyRead() n'est jamais lancé, comme si aucune donnée n'arrivait.
    pourquoi ton client n'utilise pas ce signal???

    connect(socket, SIGNAL(connected()), this, SLOT(litEtEnvoie()));
    tu est sur de ce connect?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(socket, SIGNAL(connected()), this, SLOT(litEtEnvoie()));
    Ce connect fonctionne très bien, j'ai mis un QMessageBox qui me l'a confirmé.

    Le signal ReadRead() est pour la connexion QLocalsocket du côté serveur qui attend les données.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    haaa... c'est le client qui envoie la donnée au server. dsl


    server->nextPendingConnection()
    faut appeler cela après quand il y as une connexion.
    http://qt.developpez.com/doc/4.6/qlo...dingconnection
    Donc cette fonction te retourne 0.
    De plus, il ne faut pas faire un new QLocalSOcket dessus

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    J'ai déplacé le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clientConnection = new QLocalSocket(server->nextPendingConnection());
    au début du déclenchement du signal newConnection(),
    server->nextPendingConnection() ne renvoie plus zéro mais le socket client.

    C'est plus correct mais ça ne marche pas encore

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par DSGSLA Voir le message
    C'est plus correct mais ça ne marche pas encore
    De plus, il ne faut pas faire un new QLocalSOcket dessus
    :p
    il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    clientConnection = server->nextPendingConnection();

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Man signal, man scanf => pas de manuel
    Par weed dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 17/05/2004, 16h31
  2. erreur ora-12801 : error signaled in parallel query server
    Par dngaya dans le forum Administration
    Réponses: 5
    Dernier message: 15/04/2004, 16h25
  3. [VB6] [MDI] Signaler la fermeture d'une fille à la mère
    Par cpri1shoot dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/04/2004, 08h57
  4. Dxdiag me signale que j'ai 510M de ram
    Par Goetz dans le forum DirectX
    Réponses: 1
    Dernier message: 29/09/2003, 14h33
  5. Interception du signal SIGINT
    Par macleod dans le forum MFC
    Réponses: 2
    Dernier message: 01/07/2003, 18h39

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