Exemple #1
0
    def sendAndWait(self, message):
        """
        Takes in parameter :
            - the binary message (datagram) ready to be sent
            
        Sets the SendAndWait functionality : it is called by 
        different send-methods (apart from sendAcknowledgeOIE) to send a 
        non-ack datagram to the server
        
        """
        if (self.compteurSAW < 10):

            print("compteur = {0}".format(self.compteurSAW))
            print("{0} envoie: {1}".format(self.user, decoder(message)))
            self.transport.write(message,
                                 (self.serverAddress, self.serverPort))
            self.compteurSAW += 1
            self.RerunFunction = reactor.callLater(1, self.sendAndWait,
                                                   message)
            #reactor.run()
        else:
            print(
                "la valeur max du compteur est atteinte, message non transmis")
            #self.RerunFunction.cancel()
            self.compteurSAW = 0
 def sendAndWait(self, message):
     """
     Takes in parameter :
         - the name of the concerned user
         
     Sets the SendAndWait functionality : it sends the message every second
     
     """
     if(self.compteurSAW<10):
         
         #send=encoder(user.message[0])
         print("compteur = {0}".format(self.compteurSAW))
         print("{0} envoie: {1}".format(self.user,decoder(message)))
         self.transport.write(message)
         self.compteurSAW+=1
         self.RerunFunction = reactor.callLater(1,self.sendAndWait,message)
         #reactor.run()
     else:
         print("la valeur max du compteur est atteinte, message non transmis")
         #self.RerunFunction.cancel()
         self.compteurSAW=0
    def datagramReceived(self, datagram, host_port):  # a finir
        """
        :param string datagram: the payload of the UDP packet.
        :param host_port: a touple containing the source IP address and port.

        Called **by Twisted** when the client has received a UDP
        packet.
        """
        messageDico = decoder(datagram)
        Type = messageDico.get("Type")
        ##if Type!=63: #il faut acquitter tous les paquets sauf un acquittement

        if Type == 2:  #le datagram contient la liste des films

            self.movieList = []
            i = 0
            while "taille{0}".format(i) in messageDico:
                #print(messageDico)
                tupleTemporaire = (str(messageDico["nom{}".format(i)]),
                                   str(messageDico["ip{}".format(i)]),
                                   str(messageDico["port{}".format(i)]))
                self.movieList.append(tupleTemporaire)
                self.dicoFilm["{0}".format(messageDico["Id{}".format(
                    i)])] = messageDico["nom{0}".format(i)]
                print(self.dicoFilm)
                i += 1
            ackSeq = messageDico["seq"]
            self.sendAcknowledgeOIE(ackSeq)

        if Type == 3:  #Le datagram contient la liste des utilisateurs
            self.userList = [(self.user, ROOM_IDS.MAIN_ROOM)]
            i = 0
            while "taille{0}".format(i) in messageDico:
                if messageDico["Id{0}".format(i)] == 0:
                    roomName = ROOM_IDS.MAIN_ROOM
                else:
                    roomId = messageDico["Id{0}".format(
                        i)]  #roomId est un str contenant un decimal: ex  "5"
                    roomName = self.dicoFilm["{0}".format(roomId)]
                tupleTemporaire = (str(messageDico["user{0}".format(i)]),
                                   roomName)
                print("tupletemporaire={0}".format(tupleTemporaire))
                self.userList.append(tupleTemporaire)
                i += 1
            #print(self.userList)
            #print(self.movieList)
            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

            self.clientProxy.initCompleteONE(self.userList, self.movieList)

        if Type == 4:  # le datagram est une MAJ utilisateur
            #print("entree type 4")
            roomId = messageDico["Id"]
            userName = messageDico["user"]

            if roomId == 0:
                roomName = ROOM_IDS.MAIN_ROOM
            else:  #chercher le titre du Film associé à cet Id (et pas le nom générique ROOM_IDS.MOVIE_ROOM)
                for Id, nom in self.dicoFilm.items():
                    if int(Id) == roomId:
                        roomName = nom
                #roomName=ROOM_IDS.MOVIE_ROOM
            for Tuple in self.userList:
                if Tuple[0] == userName:
                    self.userList[self.userList.index(Tuple)][1] = roomName
            #self.setUserListONE(self.userList)
            self.clientProxy.userUpdateReceivedONE(userName, roomName)

        if Type == 7:  #  inscription acceptee
            #self.clientProxy.joinRoomOKONE() #charger l interface graphique
            #ackSeq=messageDico["seq"]  #pour l'acquittement du datagram
            #self.sendAcknowledgeOIE(ackSeq)
            pass

        if Type == 8:  # error: inscription refusee
            errorCode = messageDico["erreur"]
            if errorCode == 1:
                self.clientProxy.connectionRejectedONE(
                    "nom d'utilisateur déjà utilisé")
            elif errorCode == 2:
                self.clientProxy.connectionRejectedONE(
                    "nom d'utilisateur dépassant 254 octets")
            elif errorCode == 3:
                self.clientProxy.connectionRejectedONE(
                    "nom d'utilisateur contenant un ou plusieurs espaces")

        if Type == 10:  #recevoir un message de chat des autres utilisateurs
            if not messageDico["user"] == self.user:
                rUserName = messageDico["user"]
                message = messageDico["message"]
                self.clientProxy.chatMessageReceivedONE(rUserName, message)

            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

        if Type == 11:  # ack: connexion a une salle réussie
            self.clientProxy.joinRoomOKONE()

        if Type == 12:  # ack: connexion a une salle echouee ou rejetee
            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

            self.clientProxy.connectionRejectedONE(
                "Echec: veuillez vous reconnecter"
            )  #message erreur + reouverture de l interface pour une nouvelle tentative

        if Type == 63:
            self.AckRecieved = True
            #on incrémente le numéro de séquence
            self.incrementeSeq()
        else:
            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

        return messageDico
Exemple #4
0
    def datagramReceived(self, datagram, host_port):
        """
        :param string datagram: the payload of the UDP packet.
        :param host_port: a touple containing the source IP address and port.

        Called **by Twisted** when the client has received a UDP
        packet.
        """
        messageDico = decoder(
            datagram
        )  #The datagram's fields are decoded in a dictionnary (messageDico)
        print("{0} recoit: {1}".format(self.user, messageDico))
        Type = messageDico.get("Type")

        if Type == 2:  #le datagram contient la liste des films

            self.movieList = [
            ]  #list of 3-elements-Tuples [(filmName,filmIpAdresse,filmPort)...]. used by the client Proxy (initCompleteONE()) to display the available movies
            i = 0
            while "taille{0}".format(
                    i
            ) in messageDico:  #to fill in the movieList and the dicoFilm dictionnary
                #print(messageDico)
                tupleTemporaire = (str(messageDico["nom{}".format(i)]),
                                   str(messageDico["ip{}".format(i)]),
                                   str(messageDico["port{}".format(i)]))
                self.movieList.append(tupleTemporaire)
                self.dicoFilm["{0}".format(messageDico["Id{}".format(
                    i)])] = messageDico["nom{0}".format(
                        i)]  #ex: dicoFilm={"5":'Big Buck Bunny',..... }
                #print(self.dicoFilm)
                i += 1
            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

        if Type == 3:  #Le datagram contient la liste des utilisateurs
            self.userList = [
            ]  #list of 2-elements-Tuples [(userName,movieTitle)...]. used by the client Proxy (initCompleteONE()) to display the online users
            i = 0
            while "taille{0}".format(
                    i) in messageDico:  #to fill in the userList
                if messageDico["Id{0}".format(i)] == 0:
                    roomName = ROOM_IDS.MAIN_ROOM
                else:  #find the movieTitle which matches the room ID of each client
                    roomId = messageDico["Id{0}".format(
                        i)]  #roomId est un str contenant un decimal: ex  "5"
                    roomName = self.dicoFilm["{0}".format(roomId)]
                tupleTemporaire = (str(messageDico["user{0}".format(i)]),
                                   roomName)
                #print("tupletemporaire={0}".format(tupleTemporaire))
                self.userList.append(tupleTemporaire)
                i += 1
            #print(self.userList)
            #print(self.movieList)
            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

            self.clientProxy.initCompleteONE(
                self.userList, self.movieList
            )  #affiche les listes des films disponibles et des utilisateurs connectes

        if Type == 4:  # le datagram est une MAJ utilisateur

            roomId = messageDico["Id"]
            userName = messageDico["user"]

            if roomId == 0:  #l'utilisateur veualler dans la salle principale
                roomName = ROOM_IDS.MAIN_ROOM
            elif roomId == 255:  #deconnexion totale du systeme
                roomName = ROOM_IDS.OUT_OF_THE_SYSTEM_ROOM
            else:  # l' utilisateur veut aller dans une movieRoom spécifique
                for Id, nom in self.dicoFilm.items(
                ):  #chercher le titre du Film associé à cet Id (et pas le nom générique ROOM_IDS.MOVIE_ROOM)
                    if int(Id) == roomId:
                        roomName = nom
            self.clientProxy.userUpdateReceivedONE(
                userName, roomName
            )  #MAJ la list des utilisateurs dans le systeme et la modifier sur l'interface graphique

            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

        if Type == 7:  #  inscription acceptee
            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

        if Type == 8:  # error: inscription refusee
            errorCode = messageDico[
                "erreur"]  # recuperer le code erreur contenu dans le message et informer le client selon la valeur du code
            if errorCode == 1:
                self.clientProxy.connectionRejectedONE(
                    "nom d'utilisateur déjà utilisé")
            elif errorCode == 2:
                self.clientProxy.connectionRejectedONE(
                    "nom d'utilisateur dépassant 254 octets")
            elif errorCode == 3:
                self.clientProxy.connectionRejectedONE(
                    "nom d'utilisateur contenant un ou plusieurs espaces")

            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

        if Type == 10:  #recevoir un message de chat des autres utilisateurs
            if not messageDico[
                    "user"] == self.user:  #Pour ne pas afficher un message dont le client est l'auteur
                rUserName = messageDico["user"]
                message = messageDico["message"]
                self.clientProxy.chatMessageReceivedONE(
                    rUserName, message
                )  #afficher le message sur l'interface graphique avec son auteur

            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

        if Type == 11:  #demande de connexion a une salle acceptee par le serveur
            self.clientProxy.joinRoomOKONE(
            )  #commander la connection de l'interface graphique à la salle de film que j'ai demandée

            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

        if Type == 12:  #demande de connexion a une salle rejetee par le serveur
            ackSeq = messageDico["seq"]  #pour l'acquittement du datagram
            self.sendAcknowledgeOIE(ackSeq)

            self.clientProxy.connectionRejectedONE(
                "Echec: veuillez vous reconnecter"
            )  #message erreur + reouverture de l interface pour une nouvelle tentative

        if Type == 63:
            if messageDico[
                    "seq"] == self.seq:  #le message recu est bien un ack à mon dernier message
                self.RerunFunction.cancel(
                )  # arreter le renvoi programmé dans la methode sendAndWait
                if self.deco == self.seq:  # si mon dernier message était une deconnexion totale
                    self.clientProxy.leaveSystemOKONE(
                    )  #fermer l interface graphique
                #on incrémente le numéro de séquence
                self.incrementeSeq(
                )  # N incrementer la sequence que si j'ai recu le bon acquittement
                self.compteurSAW = 0  #Reinitialise le compteur du sensAndWait

        return messageDico
    def datagramReceived(self, datagram, host_port):
        """
        :param string datagram: the payload of the UDP packet.
        :param host_port: a touple containing the source IP address and port.
        
        Twisted calls this method when the server has received a UDP
        packet.  You cannot change the signature of this method.
        """
        
        message = decoder(datagram) #on decode le message reçu
        print("\nR : {0}".format(message))
        
        if(self.listUser.get("{}".format(host_port))==None): #si l'utilisateur n'existe pas
            self.listUser["{}".format(host_port)]=userChat(message.get("user"),host_port) #on le crée
        
        user = self.listUser.get("{0}".format(host_port))
        Type = message.get("Type")
        Seq = message.get("seq")
        
        if Type == 63: #si le message est un acquittement
          if (Seq == user.serverSeq): #si le num de seq de l'ack est celui enregsitre sur le server
              self.receiverReady(user)
        
        else:#si ce n'est pas un ack
            if Seq < user.userSeq: #si le num de seq recu est inferieur a celui du client enregsitre sur le serveur
                self.sendAck(message, user) #on envoe un ack (=deja traite)
            
            else: #sinon
                self.sendAck(message, user) #on envoie un ack avant traitement
                
                if Type==1:  #si le message est une inscription
                    print(message.get("user"))
                    testAdding=self.addUser(message.get("user"), message, user)#on essaye d'ajouter l'utilisateur sur le serveur
                    if (len(testAdding) > 2): # si le retour contient un champ erreur en plus de l'entete
                        user.error=1  #on place la variable error a 1 pour signifier qu'une erreur est survenue
                        self.sendMessageToUserChat(testAdding, user) #on le place dans la liste des message a envoyer a l'utilisateur
                    
                    else: #s'il n'y a pas d'erreur
                        self.sendMessageToUserChat(testAdding, user)#on le place dans la liste des message a envoyer a l'utilisateur
                        movies=self.sendMovies(message)#recupere la liste des films
                        self.sendMessageToUserChat(movies, user)#on la place dans la liste des message a envoyer a l'utilisateur
                        users=self.sendUsers(message)#on recupere la liste des utilisateurs
                        self.sendMessageToUserChat(users, user)#on la place dans la liste des message a envoyer a l'utilisateur
                        self.updateUser(user,ROOM_IDS.MAIN_ROOM) #on actualise l'emplacement de l'utilisateur (il se trouve dans la main room)
                
                if Type==5: #si le message est un message de chat
                    messageToForward=self.messageToForward(message.get("message"), user)#on prepare le message a transferer
                    self.forwardMessage(messageToForward, user)#on transfere le message a tous les utilisateurs presents dans la main room
                    
                if Type==6: #si le message est une requete pour changer de room
                    okRoom = self.joinOKRoom(message)#on prepare a envoyer le message d'aceptation
                    self.sendMessageToUserChat(okRoom, user) #on le place dans la liste des message à envoyer à l'utilisateur
                    movieId=message.get("Id")#on recupere l'id de la nouvelle room
                    if movieId==0: #s'il vaut 0
                        self.serverProxy.updateUserChatroom(user.name, ROOM_IDS.MAIN_ROOM)#on actualise le statut de l'utilisateur qui se trouve dans la main room
                    
                    else: #sinon
                        self.serverProxy.updateUserChatroom(user.name, movieId) #on actualise le statut de l'utilisateur qui se trouve dans une movie room   
                        
                    self.updateUser(user,movieId) #on actualise le statut
                    
                if Type==9: #si le message est une requete de deconnexion
                    self.deleteUser(user) self.deleteUser() #on supprime l'utilisateur du serveur
                    

        pass
    def dataReceived(self, data):
        """
        :param data: The data received from the client (not necessarily
                     an entire message!)

        Twisted calls this method whenever new data is received on this
        connection.
        """
        self.fram += data  #on ajoute les donnees recues avec celles non utilisees que l'on avait precedemment

        datagram = framing(
            self.fram)  #permet de savoir s'il y a message complet
        #datagram est un est un tuple:
        # premier champ : données inutilisables
        # second champ : message complet ou vide

        if (datagram[1] != b''):  #s'il y a un message complet

            self.fram = datagram[0]  #on stock les donnees inutilisables
            message = decoder(datagram[1])  #on decode le message
            print("R : {0}".format(message))
            if (self.serverProxy.getUserByAddress(
                (self.clientAddress,
                 self.clientPort)) == None):  #si l'utilisateur n'existe pas
                self.user = userChat(
                    message.get("user"),
                    (self.clientAddress, self.clientPort))  #on le crée

            Type = message.get("Type")
            Seq = message.get("seq")

            if Type == 63:  #si le message est un acquittement

                if (
                        Seq == self.user.serverSeq
                ):  #si le num de seq de l'ack est celui enregsitre sur le server
                    self.receiverReady()

            else:  #si ce n'est pas un ack
                if Seq < self.user.userSeq:  #si le num de seq recu est inferieur a celui du client enregsitre sur le serveur
                    self.sendAck(message)  #on envoe un ack (=deja traite)

                else:  #sinon
                    self.sendAck(message)  #on envoie un ack avant traitement

                if Type == 1:  #si le message est une inscription
                    testAdding = self.addUser(
                        message.get("user"), message
                    )  #on essaye d'ajouter l'utilisateur sur le serveur
                    if (
                            len(testAdding) > 2
                    ):  # si le retour contient un champ erreur en plus de l'entete

                        self.user.error = 1  #on place la variable error a 1 pour signifier qu'une erreur est survenue
                        self.sendMessageToUserChat(
                            testAdding
                        )  #on le place dans la liste des message a envoyer a l'utilisateur

                    else:  #s'il n'y a pas d'erreur

                        self.sendMessageToUserChat(
                            testAdding
                        )  #on le place dans la liste des message a envoyer a l'utilisateur
                        movies = self.sendMovies(
                            message)  #recupere la liste des films
                        self.sendMessageToUserChat(
                            movies
                        )  #on la place dans la liste des message a envoyer a l'utilisateur
                        users = self.sendUsers(
                            message)  #on recupere la liste des utilisateurs
                        self.sendMessageToUserChat(
                            users
                        )  #on la place dans la liste des message a envoyer a l'utilisateur
                        self.updateUser(
                            ROOM_IDS.MAIN_ROOM
                        )  #on actualise l'emplacement de l'utilisateur (il se trouve dans la main room)

                if Type == 5:  #si le message est un message de chat

                    messageToForward = self.messageToForward(
                        message.get(
                            "message"))  #on prepare le message a transferer
                    self.forwardMessage(
                        messageToForward
                    )  #on transfere le message a tous les utilisateurs presents dans la main room

                if Type == 6:  #si le message est une requete pour changer de room
                    okRoom = self.joinOKRoom(
                        message)  #on prepare a envoyer le message d'aceptation
                    self.sendMessageToUserChat(
                        okRoom
                    )  #on le place dans la liste des message à envoyer à l'utilisateur
                    movieId = message.get(
                        "Id")  #on recupere l'id de la nouvelle room

                    if movieId == 0:  #s'il vaut 0
                        self.serverProxy.updateUserChatroom(
                            self.user.name, ROOM_IDS.MAIN_ROOM
                        )  #on actualise le statut de l'utilisateur qui se trouve dans la main room

                    else:  #sinon
                        self.serverProxy.updateUserChatroom(
                            self.user.name, movieId
                        )  #on actualise le statut de l'utilisateur qui se trouve dans une movie room

                    self.updateUser(movieId)  #on actualise le statut

                if Type == 9:  #si le message est une requete de deconnexion

                    self.deleteUser()  #on supprime l'utilisateur du serveur

        else:  #sinon
            self.fram = datagram[
                0]  #on stocke les donnes inutilisables pour la suite

        pass