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
| #!/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(message_emis):
return ''.join(chr(ord(c)+26) for c in message_emis)
def decrypt(message_recu):
return ''.join( chr(ord(c)-26) for c in message_recu) )
# 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('> ')
print 'DEBUG Emisson msg clear:','"',message_emis,'"'
message_emis = crypt(message_emis)
print 'DEBUG Emisson msg coded:','"',message_emis,'"'
self.connexion.send(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 = self.connexion.recv(1024)
print 'DEBUG Reception msg coded:','"',message_recu,'"'
message_recu = decrypt(message_recu)
print 'DEBUG Reception msg clear:','"',message_recu,'"'
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