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 :

serveur et socket


Sujet :

Réseau/Web Python

  1. #1
    Invité
    Invité(e)
    Par défaut serveur et socket
    Bonjour à tous !

    Récemment j'ai commencé à m'intéresser à la programmation socket sous Python.
    Je me suis en effet fait une application pour l'apprentissage du japonais, et je cherchais un moyen de la faire communiquer avec un serveur, pour sauvegarder les listes de vocabulaire, les progressions, etc...

    Comme je suis vraiment débutant en programmation réseau, j'aurais aimé savoir si ma démarche semble juste ou plutôt boiteuse...


    0) Je crée un socket, de type datagram sur le serveur qui sera en écoute
    1) Dans mon client je crée un socket datagram, et envoie un message au socket serveur
    2) Le serveur renvoie un numero de port au client, et crée en même temps un nouveau socket de type stream assigné au port envoyé (dans un thread à part je dirais)
    3) Le client crée de son côté un socket stream, et se connecte au serveur
    4) J'envoie au serveur une structure de données (serialisée) qui lui indiquera quelle fonction exécuter et avec quels arguments
    5) Le serveur renvoie sa réponse
    6) Je tue les sockets stream des deux côtés

    Ca me semble vraiment très brouillon comme façon de faire, mais j'avoue ne pas en connaitre d'autre.
    Est-ce qu'il y a d'autres façons plus efficaces de résoudre ce genre de problème ?

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    salut,

    quelques remarques:

    1/ les sockets 'type datagrame' utilisent le protocole UDP, qui ne garanti notamment pas la 'non-perte' des paquets. Ce protocole (UDP) ne semble pas approprié dans ton utilisation ; pour faire simple:

    - l'UDP est utile pour des communications réseaux avec un très fort besoin de temps réel, mais reste beaucoup plus compliqué à gérer car certaiens fonctionnalités lui 'manquent' (garantie d'acheminement des paquets, réception dans le bon ordre, ...)

    - le TCP est le protocole utilisé dans 95% des cas et (hormis des cas très ciblés (jeu FPS, vidéochat, voIP) où UDP se comporte mieux) convient la plupart du temps et devrait être utilisé sauf quand on sait exactement ce qu'on fait.

    Je te conseille donc de te tourner plutôt vers TCP.

    2/ Tu n'es pas obligé d'avoir un port par client connecté à ton serveur, surtout en TCP ; par exemple un serveur web qui écoute sur le port TCP 80 (HTTP) peut très bien recevoir des milliers de connexions simultanées.

    3/ "J'envoie au serveur une structure de données (serialisée) qui lui indiquera quelle fonction exécuter et avec quels arguments" : un bon principe à suivre à la base est de ne jamais faire confiance aux données envoyées par le client. En effet, rien ne te garanti que les données que tu reçois ne proviennent pas d'une version modifiée de ton programme client qu'un hacker aurait programmé en vue de pirater ton serveur par exemple.
    Ce n'est donc surtout pas au client de dire au serveur ce qu'il doit faire, mais à l'inverse au serveur de systématiquement vérifier ce que lui dit le client.

    Dans l'esprit, le client va plutôt envoyer un message avec un type, genre "j'aimerais connaître le contenu du répertoire x" ; le serveur va alors:

    - vérifier que le message est bien formé (nombre d'octets, type et nombre d'arguments, ...)

    - vérifier que le client en question a les droits de demander cette action (client authentifié ? quels droits sur quelles parties du filesystem ? etc...)

    - effectuer l'action et envoyer la réponse.
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nouknouk Voir le message
    salut,
    2/ Tu n'es pas obligé d'avoir un port par client connecté à ton serveur, surtout en TCP ; par exemple un serveur web qui écoute sur le port TCP 80 (HTTP) peut très bien recevoir des milliers de connexions simultanées.
    Dans ce cas, il faut mettre le socket en écoute permanente ?
    Par exemple pour le serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    HOST = 'tokyo'
    PORT = 12345
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    while 1:
        s.listen(1)
        conn, addr = s.accept()
        while 1:
            data = conn.recv(1024) 
            if not data: break
            conn.send(data)
        conn.close()
    et pour le client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    HOST = 'tokyo'
    PORT = 12345
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT))
    s.send('Hello')
    data = s.recv(1024)
    s.close()

    Citation Envoyé par nouknouk Voir le message
    3/ "J'envoie au serveur une structure de données (serialisée) qui lui indiquera quelle fonction exécuter et avec quels arguments" : un bon principe à suivre à la base est de ne jamais faire confiance aux données envoyées par le client.
    Je pensais plus envoyer une chaine du type "importer", "exporter", suivie d'infos basiques comme "username" et autres arguments sérialisés, et ensuite laisser le serveur appeler les fonctions appropriées après les vérifications qui s'imposent.

  4. #4
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    bonjour,

    tu peux utiliser les librairies xmlrpcserver et xmlrpclib pour invoquer des méthodes à distance.

    un exemple est disponible dans la doc.

    bon python
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ohh, brillant !!!
    Je ne connaissais pas du tout ce XMLRPC !
    Ca répond parfaitement à mon besoin on dirait !
    Merci beaucoup pour l'info !

Discussions similaires

  1. comment passer un paramètre a un serveur de socket
    Par orobin dans le forum Silverlight
    Réponses: 4
    Dernier message: 16/09/2008, 22h06
  2. Intégrer un serveur de sockets dans JBoss
    Par DevTeam_ dans le forum Wildfly/JBoss
    Réponses: 15
    Dernier message: 24/01/2008, 10h54
  3. Serveur de Socket
    Par ggounouman dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 22/08/2007, 14h08
  4. Lancer un serveur de socket par SSH
    Par ouss dans le forum Linux
    Réponses: 5
    Dernier message: 15/06/2007, 12h29
  5. Arrêt d'un serveur (connexion socket)
    Par Goduak dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 25/02/2007, 12h32

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