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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| host = '192.168.1.15'
port = 12056
import socket, sys, threading
stop_thread_e=False
# Programme principal - Établissement de la connexion :
connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
connexion.connect((host, port))
print ("Connexion établie avec le serveur.")
class ThreadReception(threading.Thread):
def __init__(self, conn):
threading.Thread.__init__(self)
self.connexion = conn # réf. du socket de connexion
def run(self):
global stop_thread_e
print('Vous pouvez maintenant poster des messages !')
try:
while not stop_thread_e:
message_recu = self.connexion.recv(250)
print ('\n'+message_recu.decode()+'\nVous > ',end='')
if message_recu.upper() == "FIN":
print("\nClient arrêté. Connexion interrompue.")
sys.exit()
except :
pass
# Le thread <réception> se termine ici.
# On force la fermeture du thread <émission> :
stop_thread_e=True
self.connexion.close()
class ThreadEmission(threading.Thread):
def __init__(self, conn):
threading.Thread.__init__(self)
self.connexion = conn # réf. du socket de connexion
def run(self):
while not stop_thread_e:
message_emis = input('Vous > ')
try : self.connexion.send(message_emis.encode())
except :
print('\nAncien serveur déconnecté !\nRéinitialisation...\n##############################\n')
import Chat#Chat étant le fichier lui-même, une sorte de réinitialisation
connexion.send(input('Entrez votre identifiant : ').capitalize().encode())
# 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_R.start()
th_E.start()
except :
print('Vous êtes le premier arrivé sur ce serveur de chat !')
host = ''
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 :
try:
while 1:
msgClient = self.connexion.recv(250)
msgClient=msgClient.decode()
if msgClient.upper() == "FIN" :
break
elif msgClient=='':continue
message = "{} : {}".format(self.nom, msgClient)
print ('\n'+message+'\nVous > ',end='')
# Faire suivre le message à tous les autres clients :
for cle in conn_client:
if cle != self.nom: # ne pas le renvoyer à l'émetteur
conn_client[cle].send(message.encode())
except : pass
# Fermeture de la connexion :
self.connexion.close() # couper la connexion côté serveur
del conn_client[self.nom] # supprimer son entrée dans le dictionnaire
print("Client {} déconnecté :(.".format(self.nom))
print('Liste des membres en ligne : '+th_E.nom,*conn_client.keys(),sep=', ',end='\nVous > ')
for cle in conn_client:
conn_client[cle].send("Client {} déconnecté :(.".format(self.nom).encode()+b'\n'+b'Liste des membres en ligne : '+th_E.nom.encode()+b', '+', '.join(conn_client.keys()).encode())
# Le thread se termine ici
# Initialisation du serveur - Mise en place du socket :
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
mySocket.bind((host, port))
except socket.error:
print ("La liaison du socket à l'adresse choisie a échoué.")
input()
sys.exit()
mySocket.listen(5)
# Attente et prise en charge des connexions demandées par les clients :
conn_client = {} # dictionnaire des connexions clients
################
#passons à la partie client de notre serveur
class ThreadEmission(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
self.nom=input('Entrez votre identifiant : ').capitalize()
print('Vous pouvez maintenant poster des messages !\n')
while 1:
message_emis = input('Vous > ')
for connexion in conn_client.values() : connexion.send(self.nom.encode()+b' : '+message_emis.encode())
th_E = ThreadEmission()
th_E.start()
while 1:
connexion, adresse = mySocket.accept()
# Créer un nouvel objet thread pour gérer la connexion :
th = ThreadClient(connexion)
th.start()
# Mémoriser la connexion dans le dictionnaire :
nom=connexion.recv(10).decode()
conn_client[nom] = connexion
th.nom=nom
# Dialogue avec le client :
print(nom+' entre dans le salon de chat !')
print('Liste des membres en ligne : '+th_E.nom,*conn_client.keys(),sep=', ',end='\nVous > ')
for cle in conn_client:
if cle != nom: # ne pas le renvoyer à l'émetteur
conn_client[cle].send(nom.encode()+b' entre dans le salon de chat !')
liste_membres=b'Liste des membres en ligne : '+th_E.nom.encode()+b', '+', '.join(conn_client.keys()).encode()
conn_client[cle].send(liste_membres) |
Partager