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 :

Plusieurs connexions sur QLocalServer


Sujet :

Réseau

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut Plusieurs connexions sur QLocalServer
    Bonjour,

    J'ai un système QLocalserver/QLocalsocket qui fonctionne !
    Or j'aimerai compliquer la chose, en fait je souhaiterai envoyer plusieurs fois des données à partir du serveur vers le client !

    Est-ce que je peux garder la même socket ?? car lorsque j'ai envoyé des données à mon client une première fois, le côté client, après avoir reçu et traité les données, perd la connexion avec l'appareil sur lequel il est déployé.

    Donc j'ai essayé, après avoir reçu et traité les données, de fermer la socket existante et dans créer une autre ! ceci marche bien, ça ne me fait plus planté la connexion avec l'appareil mais les nouvelles données que m'envoi le serveur ne sont pas réceptionnées, le serveur ne capte même pas le signal newConnection() !

    Comment dois-je procéder pour établir un connexion quasi-permanente avec le serveur ou sinon renouveler la socket ??

    Si le code est necessaire dit-le moi !!
    Je vous remercie d'avance !

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 63
    Par défaut
    lorsque j'ai envoyé des données à mon client une première fois, le côté client, après avoir reçu et traité les données, perd la connexion avec l'appareil sur lequel il est déployé.

    Cette perte de connexion est-elle supposée normale et en relation avec l'appareil que tu utilises?

    Parce que logiquement, une fois ta connexion établie entre ton client et son serveur, tu peux envoyer tout ce que tu veux et autant de temps que tu le souhaites.

    Je pense que tu peux mettre un peu de code pour que l'on se rende compte.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut
    Bonjour,

    Non la perte de connexion avec l'appareil n'est pas normale du tout, c'est ce que je ne comprend pas !

    voici le code de mon côté 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Socket::Socket()
     {
    	 socket = new QLocalSocket(this);
    	 connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
         connect(socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(displayError(QLocalSocket::LocalSocketError)));
    	 requestNewConnexion();
     }
    
      void Socket::NewConnexion()
     {
    	requestNewConnexion();
     }
    
     //Connection du client au serveur
     void Socket::requestNewConnexion()
     {
    	
         socket->abort();
         socket->connectToServer("halooreach1");
    	 if (socket->waitForConnected(200000))
    		qDebug("Connected!");
    	 else
    		qDebug() << "socket error : " <<socket->errorString();
     }
    
     //Récupération des données du serveur
     void Socket::readData()
     {
    		//lit le contenu de la socket
    		QByteArray result = socket->read(3000);
    		qDebug("Tout le message a été reçu") ;
    		//Parse le message
    		BasicParser(result);
    		qDebug("Message enregistré!");
    		WaitForData();
     }
    
     void Socket::WaitForData()
     {
    		if(socket->waitForReadyRead(3000))
    			qDebug("En attente de nouveaux messages");
    		else
    			qDebug("Opréation terminée");
     }
    
     void Socket::displayError(QLocalSocket::LocalSocketError socketError)
     {
         switch (socketError) 
    	 {
         case QLocalSocket::ServerNotFoundError:
            qDebug() << "The host was not found. Please check the host name and port settings.";
             delete socket;
    		break;
         case QLocalSocket::ConnectionRefusedError:
             qDebug() << "The connection was refused by the peer.Make sure the fortune server is running, and check that the host name and port settings are correct.";
             delete socket;
    		 break;
         case QLocalSocket::PeerClosedError:
    		 delete socket;
             break;
         default:
             qDebug() << "The following error occurred: %1.";
    		 delete socket;
         }
    
     }
    je vous épargne les méthodes pour parser le message.
    Apparemment le problème viendrai de ce côté.

    J'ai essayé de rajouter un WaitForReadyRead(), comme vous pouvez le voir ci-dessus mais cela n'a rien changé, laconnexion est quand même perdu par contre lorsque je delete ma socket et que j'effectue une nouvelle connexion avec le serveur juste après, la connexion avec l'appareil n'est pas perdue !


    Si vous avez aussi besoin du côté serveur dit-le moi.

    Merci pour votre aide !

  4. #4
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Peux tu montrer comment tu utilises ta classe Socket ?
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut
    Voici mon main côté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main(int argc, char *argv[])
    {
    	QCoreApplication a(argc, argv);
     
    	Socket::getInstance();
     
    	return a.exec();
    }
    Je crée ma socket et après tant que le signal ReadyRead() n'est pas envoyé la socket attend !

    et voici du côté serveur comment j'utilise ma socket nommé "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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    //Initialisaton du serveur
    LocalServer::LocalServer(QString serverName) : m_server(this)
    {
    	connect(&this->m_server,SIGNAL(newConnection()),this,SLOT(NewConnectionOnServer()));
    	connect(client,SIGNAL(readyRead()),this,SLOT(ReadOK()));
    	connect(MessagingSystemSerial::getInstance(),SIGNAL(MessageReceived()),this,SLOT(SendDataToClient()));
    	connect(client, SIGNAL(disconnected()),client, SLOT(deleteLater()));
    
        if( !this->m_server.listen(serverName))
        {
           qDebug() << "Problème le server [" << serverName << "] est déjà à l'écoute..." ;
           QTimer::singleShot(2000, QCoreApplication::instance(), SLOT(quit()));
        }
        else
        {
    		
           qDebug() << "Installation du serveur [" << serverName << "]" ;
    	   this->m_server.setMaxPendingConnections(10);
    	   this->m_server.waitForNewConnection(2000000);
        }
    }
    
    //Y a-t-il une nouvelle connexion ?
    void LocalServer::NewConnectionOnServer()
    {
        if(this->m_server.hasPendingConnections() == true)
    	{
    		client = this->m_server.nextPendingConnection();
    		qDebug() << "Nouvelle connexion sur le serveur ";
    	}
    	else
    		qDebug() << " Il n'y a pas de connexions en attentes ";
         
    }
    
     
    void LocalServer::ReadOK()
    {
    	client = qobject_cast<QLocalSocket*>(sender());
     
        QString str = client->readAll();
     
       qDebug()<< QString("##: " + str +"\n");
     
    }
    
    // Envoi des données(QByteArray) par la socket
    void LocalServer::SendDataToClient()
    {
    	if(client)
    	{
    			QByteArray block = MessagingSystemSerial::getInstance()->GetDataByteArray();
    
    			if(client->write(block) == -1)
    				qDebug() << " L'écriture des données à échouée  ";
    			else
    				qDebug() << " Ecriture des données ";
    
    			client->flush();
    			client->disconnectFromServer();
    	}
    	else
    		qDebug() << " Les données ne peuvent pas être envoyées ";
    }

    et voici mon main côté 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
     
    int main(int argc, char *argv[])
    {
    	QCoreApplication a(argc, argv);
     
    	//Initialisation du serveur	
    	LocalServer server(SERVER_NAME);
     
    	//Revision SVN
    	QString rev(SVN);
    	rev = rev.replace(" $","").replace("$Rev: ","");
    	a.setApplicationVersion("2.5." + rev);
     
    	// mise en route du thread pour la récupération de données
    	MessagingSystemSerial::getInstance()->InitBOX();
     
    	return a.exec();
    }
    Voila comment j'utilise ma socket, j'espère que cela répond à ta demande ?!

    Merci de votre aide encore un fois !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2010
    Messages : 257
    Par défaut
    Problème résolu !

    Désolé mais c'est ridicule comme erreur !
    En fait, je ne m'étais pas aperçu que je déconnectais ma socket du serveur avec "client->disconnectFromServer()" donc je l'ai enlevé et voila tout marche !

    Merci pour votre aide, et désolé de vous avoir dérangé pour ça !

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

Discussions similaires

  1. Plusieurs questions sur les connexions
    Par Vince7-7 dans le forum Informatica
    Réponses: 1
    Dernier message: 28/12/2011, 22h25
  2. [WD16] SQLTransaction sur plusieurs connexions
    Par Pascal26120 dans le forum WinDev
    Réponses: 3
    Dernier message: 25/08/2011, 20h22
  3. [Débuter] Gestion de plusieurs connexions sur QLocalServer
    Par kek's dans le forum Réseau
    Réponses: 2
    Dernier message: 09/02/2011, 15h17
  4. [sh] Connexion sur plusieurs équipements
    Par suya95 dans le forum Linux
    Réponses: 2
    Dernier message: 04/05/2010, 11h37
  5. [C#][Mysql]Comment utiliser plusieurs dataset sur la même connexion
    Par Invité dans le forum Accès aux données
    Réponses: 3
    Dernier message: 05/12/2006, 09h30

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