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
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