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
| #!/usr/bin/env python
#-*-coding:Utf-8-*-
# Python est optionnellement multi-threadé, si on lui donne les bonnes
# "commandes", donc j'ai utilisé ici les bonnes "commandes" en utilisant
# une classe pour chaque thread, un pour la réception l'autre l'émission
# Utilise les threads pour gérer les connexions clientes en parallèle.
import socket, sys, threading
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 )
ip = raw_input("Entrez le numéro de votre pc serveur : ")
HOST = "127.0.0.%s" % (ip)
PORT = 40000
class ThreadClient(threading.Thread):
"""dérivation d'un objet thread pour gérer la connexion avec un client"""
def __init__(self, conn):
threading.Thread.__init__(self)
self.connexion = conn
def run(self):
# Dialogue avec le client :
# La personne gérant le serveur attribue un pseudo aux nouveaux
# connectés.
nom = nom = self.getName() # Chaque thread possède un nom
while 1:
coded_message = self.connexion.recv(1024)
clear_message = decrypt(coded_message)
if clear_message.upper() == "FIN" or msgClient =="":
break
coded_message = crypt("{nom:<12}>> {msg}".format(nom=nom, msg=clear_message))
# Faire suivre le message à tous les autres clients :
for cle in conn_client:
if cle != nom:
conn_client[cle].send(coded_message)
# Fermeture de la connexion :
self.connexion.close()
del conn_client[nom]
print "Client %s déconnecté." % nom
# Le thread se termine ici
# **********************************************************************
# Initialisation du serveur - le socket AF_INET s'occupe de la liaison
# au port et le sock_stream de l'échange de donnée, ce sont des éléments
# intégrés au module socket :
# **********************************************************************
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
mySocket.bind((HOST, PORT))
except socket.error:
print "Pas de liaison de socket pour l'adresse choisie."
sys.exit()
print "Le serveur est prêt, en attente de clients"
mySocket.listen(5)
# Attente et prise en charge des connexions demandées par les clients :
conn_client = {} # dictionnaire des connexions clients
while 1:
connexion, adresse = mySocket.accept()
# Créer un nouvel objet thread pour gérer la connexion :
th = ThreadClient(connexion)
th.start()
# Mémorisation de la connexion dans le dictionnaire :
# Identifiant sauvé dans le dictionnaire
it = th.getName()
conn_client[it] = connexion
print "Client %s connecté, adresse IP %s, port %s." %\
(it, adresse[0], adresse[1])
# Dialogue avec le client :
connexion.send(crypt("Vous êtes connecté. Envoyez vos messages.")) |