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 :

Probleme socket recv


Sujet :

Réseau/Web Python

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut Probleme socket recv
    Bonjour à tous,

    Mon probleme est relativement simple mais j'ignore totalement quelle méthode adopter pour le contourner.

    J'ai désire faire un petit jeu online, pour cela j'ai deux client et un serveur. Les deux client se connecte au serveur et chaque donnée envoyé par les clients sont renvoyées vers tous les clients connectés au serveur (le serveur ne fait que récupèrer les requettes et les renvoies aux autres clients).

    Mon probleme,
    En loopback (tout sur la meme machine) aucun probleme toutes les requettes sont envoyés et récupérés, mais lorsque je commence a mettre en place ce systeme sur un réseau, il arrive sans arret que les requettes soit groupés.

    En gros, les clients envoient des requettes successives : 1, 2, 3
    Les données ne transite pas à la meme vitesse et du coup en faisant un connexion.recev, j'obtient :123, ou 12, 1

    Ce que je souhaiterai faire, c'est bien entendu pour chaque envoie de requette une seule reception et non fusionné mais requettes :s

    J'espere avoir été compris mais dans le ca sonctraire, n'hesitez pas à me le faire savoir

    Merci d'avance à tous...

    Mickael

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    détailles un peu stp ...

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Il suffit de donner la taille des requêtes, Comprendre connexion.recev(taille).

    Si la taille n'est pas connue d'avance pourquoi ne pas passer par un marquer (Copier/coller rapide)

    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
            self.EndMarker='*End*'
    ....
        def recvall(self):
            reponse=[]
            rcvdata=''
            while True:
                rcvdata=self.connect.recv(20)
                if self.EndMarker in rcvdata:
                    reponse.append(rcvdata[:rcvdata.find(self.EndMarker)])
                    break
                reponse.append(rcvdata)
                if len(reponse) > 1:
                    veriflist = reponse[-2] + reponse[-1]
                    if self.EndMarker in veriflist:
                        reponse[-2] = veriflist[:veriflist.find(self.EndMarker)]
                        reponse.pop()
                        break
            return ''.join(reponse)
    Mais le principal c'est de bien différencier les clients (re ctrl c)
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    import threading
    import socket
    from string import split
     
    dictclients = {}
     
    class Client(threading.Thread):
        def __init__(self, socketclient):
            threading.Thread.__init__(self)
            self.clisock = socketclient
            self.EndMarker='*End*'
     
        def newConnect(self):
            NewClient = self.clisock.recv(500)
            if NewClient in dictclients.keys():
                self.clisock.send('Nok')
            else:
                self.clisock.send('Ok')
                NewType = self.clisock.recv(1)
                self.clisock.send('Ok')
                NewPass = self.clisock.recv(500)
                self.cliname = NewClient.strip()
                self.clipass = NewPass.strip()
                self.clitype = NewType.strip()
                dictclients[self.cliname] = (self.clipass, self.clitype, self.clisock, self)
                self._stopevent = threading.Event()
     
        def returnclilist(self):
            _deadclients = []
            for keys, values in dictclients.iteritems():
                print keys, values
                if values[2] != self.clisock:
                    try:
                        values[2].send('test')
                    except socket.error, e:
                        _deadclients.append(keys)
            for clients in _deadclients:
                dictclients[clients][3].stop()
                del dictclients[clients]
            retstr = ''
            for elems in dictclients.keys():
                if len(elems) < 11:
                    elem = elems + (' ' * (11 - len(elems)))
                retstr = retstr + elem + dictclients[elems][1]
            self.clisock.send(retstr)
            print dictclients
     
        def run(self):
            self.newConnect()
            while not self._stopevent.isSet():
                try:
                    buff = self.clisock.recv(20)
                except:
                    buff = ''
                if 'ListeClient' in buff:
                    self.returnclilist()
                self._stopevent.wait(2.0)
            self.clisock.close()
    # Le try pour :
    #Traceback (most recent call last):
    #  File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
    #    self.run()
    #  File "alivesvr.py", line 56, in run
    #    buff = self.clisock.recv(20)
    #  File "/usr/lib/python2.6/socket.py", line 167, in _dummy
    #    raise error(EBADF, 'Bad file descriptor')
    #error: [Errno 9] Bad file descriptor
    # A gerer plus tard
     
        def stop(self):
            self._stopevent.set()
     
    if __name__ == "__main__":
        svrsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        svrsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        try:
            svrsocket.bind(('',8000))
        except ValueError, e:
            print e
        svrsocket.listen(5)
        while True:
            (socketclient, addr) = svrsocket.accept()
            ct = Client(socketclient)
            ct.start()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut
    Bonjour,

    Merci pour votre reponse, en effet, j'ai finis par adopter une borne a la fin de ma requette, et depuis, tout fonctionne bien.

    Merci beaucoup

    Résolu

    Mickael

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

Discussions similaires

  1. [socket]probleme avec recv()
    Par mayu5 dans le forum Réseau
    Réponses: 1
    Dernier message: 12/04/2008, 02h43
  2. Socket, recv et select qui ne marche pas
    Par Zapan dans le forum Réseau
    Réponses: 18
    Dernier message: 30/06/2006, 20h19
  3. [Système] Probleme Socket Php
    Par Reaggaman dans le forum Langage
    Réponses: 4
    Dernier message: 01/03/2006, 18h55
  4. Problemes socket
    Par Proxius dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/07/2005, 14h25
  5. Probleme socket
    Par Spolix dans le forum Réseau
    Réponses: 6
    Dernier message: 03/10/2003, 06h50

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