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 85 86
| #!/usr/bin/env python
#-*-coding:Utf-8-*-
# ***********************************************************************
# Définition d'un client réseau gérant en parallèle l'émission
# et la réception des messages.
# Ce sont les threads qui s'occupent de se travail là, un thread pour
# la réception, et un pour l'émission des messages.
# **********************************************************************
ip = raw_input("Entrez le numéro du pc serveur : ")
HOST = "192.168.0.%s" % (ip)
PORT = 40000
# **********************************************************************
# Nous avons besoin des sockets car ils vont servir comme une sorte de
# logiciel lié au port de communication (dans ce cas 40 000)
# L'achange de donnée se fait aussi par une fonction des sockets le
# stream socket, moins évolué que les packets mais plus simple et
# demandant moins de ressources, c'est grâce au livre de M. Swinnen que
# j'ai pu utiliser ces technologies.
# **********************************************************************
import socket, sys, threading
# Création de la fonction pour crypter le message message_emis sera donné dans le thread émission plus loin.
def crypt(self, message_emis):
message_emis = chaine
cpt_crypt=0
dec = 26
crypt = ""
while cpt_crypt < len(chaine):
crypt += chr(ord(chaine[cpt_crypt]) + dec)
cpt_crypt += 1
def decrypt(self):
message_recu = message_emis
cpt_decrypt = 0
decrypt = ""
while cpt_decrypt < len(message_recu):
decrypt += chr(ord(message_recu[cpt2]) - dec)
cpt_decrypt +=1
# Classe permettant la gestion du thread s'occupant de l'émission du message.
class ThreadEmission(threading.Thread):
"""objet thread gérant l'émission des messages"""
def __init__(self, conn):
threading.Thread.__init__(self)
self.connexion = conn
# réf. du socket de connexion
def run(self):
while 1:
message_emis = raw_input()
self.connexion.send(crypt(message_emis))
# Classe permettant la gestion du thread s'occupant de la réception du message.
class ThreadReception(threading.Thread):
"""objet thread gérant la réception des messages"""
def __init__(self, conn):
threading.Thread.__init__(self)
self.connexion = conn # réf. du socket de connexion
def run(self):
while 1:
message_recu = decrypt(self.connexion.recv(1024))
print "'" + message_recu + "'"
if message_recu =='' or message_recu.upper() == "FIN":
break
# **********************************************************************
# Fermeture par un break (le mal) du thread (classe) réception
# On force la fermeture du thread émission (th_E) :
# on ferme
# **********************************************************************
th_E._Thread__stop()
print "Client arrêté. Connexion interrompue."
self.connexion.close()
# Établissement de la connexion :
connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
connexion.connect((HOST, PORT))
except socket.error:
print "La connexion a échoué."
sys.exit()
print "Connexion établie avec le serveur BlackWater."
# Dialogue avec le serveur : on lance deux threads pour gérer
# indépendamment l'émission et la réception des messages :
th_E = ThreadEmission(connexion)
th_R = ThreadReception(connexion)
th_E.start()
th_R.start() |
Partager