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/Web Python Discussion :

dialogue entre 2 handlers de sockets


Sujet :

Réseau/Web Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut dialogue entre 2 handlers de sockets
    Bonjour,

    J'aimerai réaliser un programme faisant appel au réseau. Jusque là rien de compliqué.
    Le problème est que dans ce programme, il y a 2 serveurs qui doivent communiquer entre eux.

    Un petit schéma, ça sera tout suite plus clair (les étapes sont numérotées) :



    - en jaune le serveur physique
    - en vert les clients physiques

    Dans l'exemple, on voit que la brique "Socket TCP (client)" sert de console d'administration et pilote tout le programme. C'est elle qui envoie les ordres.
    Elle demande de voir les différences du fichier "file1".

    La question est la suivante :

    Comment dois-je m'y prendre pour faire communiquer les 2 sockets (Serveur) entre elles ?

    En effet, j'utilise SocketServer qui est franchement pratique mais le handler se trouve dans une classe à part. Je ne peux donc pas récupérer "self.wfile" et "self.rfile" des 2 sockets dans une méthode qui gèrerait le dialogue entre les 2 serveurs.

    Je vous met en exemple un client/serveur bateau avec SocketServer :

    exemple de 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
     
    import SocketServer
    import socket
     
    class SimpleTCPServer(SocketServer.ThreadingTCPServer):
     
        def __init__(self, ip, port, handler):
            SocketServer.ThreadingTCPServer.__init__(self, (ip, port), handler)
     
        def start(self):
            try:
                self.serve_forever()
            except KeyboardInterrupt as e:
                self.socket.shutdown(socket.SHUT_RDWR)
                self.socket.close()
     
    class SimpleTCPHandler(SocketServer.StreamRequestHandler):
     
        def handle(self):
            print("New connection from %s:%d" %self.client_address)
            self.wfile.write("Welcome to server")
            print(self.rfile.readline().strip())
     
    if __name__ == "__main__":
        server = SimpleTCPServer("localhost", 2001, SimpleTCPHandler)
        server.start()
    exemple de 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
     
    import socket
     
    class AdminClient:
     
        def __init__(self, ip, port):
            self.ip = ip
            self.port = port
     
        def connect(self):
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.connect((self.ip, self.port))
            print("wait message")
            print(self.sock.recv(100))
            print("after message")
            self.sock.send("exit")
     
        def disconnect(self):
            self.sock.shutdown(socket.SHUT_RDWR)
            self.sock.close()
     
    if __name__ == "__main__":
        client = AdminClient("localhost", 2001)
        client.connect()
        client.disconnect()
    Je m'y prend mal ? Quelqu'un aurait un conseil ?
    Et si je ne suis pas très clair, n'hésitez pas à me demander des précisions.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 744
    Par défaut
    Salut,

    Comment dois-je m'y prendre pour faire communiquer les 2 sockets (Serveur) entre elles ?
    "Socket" est une API de programmation IP hérité d'UNIX BSD.
    On fait communiquer un client et un serveur au dessus d'IP en utilisant l'API "socket".

    Un serveur "écoute" (listen) les demandes de connexion d'un client à un port (2001) et à des adresses IP spécifiques (sinon toutes) tel que décrit via 'bind'.
    Il "accepte" les connexion et "traite" les requêtes.

    Le client effectue les demande de connexion à l'adresse du 'host' et sur le port spécifié. C'est client ou serveur et pas les deux...

    Après rien n'empêche d'avoir un "process" qui soit "client" et "serveur" mais côté API, les sockets (instances) devront être différentes et il faudra choisir une technique de multiplexage (select, thread) pour être à la fois client et serveur.

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut
    Salut wiztricks

    Merci pour ta réponse.
    Du point de vue fonctionnement des sockets, le principe est maitrisé.

    Je pense que mon problème est plus d'ordre algorithmique.

    Je vais tenter d'expliquer les choses autrement.

    Avec mon implémentation actuelle, j'ai donc :
    - un client/serveur(que j'appellerai remote) qui gère les connexions multiples vers des hotes distants
    - un client/serveur(que j'appellerai admin) qui permet de traiter les commandes qui passe l'utilisateur

    Je lance les 2 serveurs (remote et admin)
    je lance le client remote. La connexion s'établie, la fonction SimpleTCPHandler.handle de l'instance du serveur remote s'execute.
    je lance le client admin. La connexion s'établie, la fonction SimpleTCPHandler.handle de l'instance du serveur admin s'execute.

    Logiquement il faudrait que dans la fonction handle du serveur admin "traduise" et "forward" les instructions vers le serveur remote.
    Le problème est que dans le "scope" de fonction handle du serveur admin, je n'ai aucune reférence au serveur remote.

    La fonction handle est appelée directement dans le module SocketServer donc pas moyen de passer une variable en paramètre. Je peux même pas passer la référence d'une socket d'un serveur vers l'autre puisse que la fonction handle est dans une classe séparée.

    Bref je vois pas de solution à part réécrire entièrement un serveur TCP sans passer par ServerSocket.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 140
    Par défaut Solution ?
    Salut sluke,

    je ne maitrise pas tout ton projet mais si je comprends bien , tu es bloqué par ce que tu ne sais pas faire un lien entre deux sockets?

    si tel est le cas, je te propose dans ton serveur frontal une interface dans ce genre (en utilisant des threads en fait)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def main():
     
      s1 = socket1(adress)
      s2 = socket2(adress)
     
      #serve forever
      while True:
        s2.write(s1.input())
    Avec les sockets qui ouvrent des connexion threadées

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Sur ce lien tu dois avoir ce que tu cherches, c'est à dire une emission et réception simultanée.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 744
    Par défaut
    Salut,

    Citation Envoyé par sluke Voir le message
    Logiquement il faudrait que dans la fonction handle du serveur admin "traduise" et "forward" les instructions vers le serveur remote.
    Le problème est que dans le "scope" de fonction handle du serveur admin, je n'ai aucune reférence au serveur remote.
    Ben il faut la créer! i.e lorsque le serveur "admin" reçoit une nouvelle connexion il créera une connexion vers "remote"

    Et çà se passera dans handle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def handle(self):
            print("New connection from %s:%d" %self.client_address)
            ...
    La fonction handle est appelée directement dans le module SocketServer donc pas moyen de passer une variable en paramètre. Je peux même pas passer la référence d'une socket d'un serveur vers l'autre puisse que la fonction handle est dans une classe séparée.
    Cela suppose (mais vous n'êtes pas très clair) partager une connexion entre "admin" et "remote" pour multiplexer les requêtes de plusieurs clients.

    Rien ne vous empêche dans ce cas de créer la connexion, la stocker dans l'instance de "SimpleTCPServer" et de la récuperer dans "handle" via self.server.connexion.

    note: "multiplexer les requêtes" dans le tuyau est bien plus compliqué et un design différent que réer autant de tuyaux que de client et les gérer séparément via des threads.

    Bref je vois pas de solution à part réécrire entièrement un serveur TCP sans passer par ServerSocket.
    Ben voyons, rien que çà!

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Socket : Dialogue entre 2 PC
    Par Arnau6 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 20/12/2012, 16h10
  2. [Concept] Différence entre rmi et les socket
    Par Luther13 dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 14/12/2005, 14h31
  3. Réponses: 72
    Dernier message: 05/12/2005, 10h45
  4. Dialogue entre systemes embarqués sur un réseau.
    Par zodd dans le forum Développement
    Réponses: 1
    Dernier message: 10/11/2005, 09h34
  5. [FLASH MX2004] [AS2] Dialogue entre 2 SWF- tellTarget ???
    Par Geilgestorm dans le forum ActionScript 1 & ActionScript 2
    Réponses: 11
    Dernier message: 24/10/2004, 22h07

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