Voilà un petit code en python qui pourras servir de base :
J'ai essayer de commenter un peu le truc, mais certaines parties reste dégeu et la gestion d'erreurs est loin d'etre parfaite :') c'est du tcp, je vais rtfm pour udp
Code PYTHON :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, time, socket,threading
class Node():
"""
Cette classe représente un node
"""
def __init__(self,Port):
"""
Cette fonction démarre le serveur sur le port 1024, puis se met sur écoute
"""
print("Création du node...")
print("\tConfiguration en cours...")
self.Host = '127.0.0.1'
self.Port = int(Port)
self.Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.Socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#Cette ligne corrige un problème de libération de port
self.Nodes=dict()#Dictionnaires qui stockeras les connexions avec les autres nodes
print("\tConfiguration terminé.")
try:
self.Socket.bind((self.Host,self.Port))#on tente de l'utiliser
except:
print("Creation de la socket impossible")
sys.exit()
print("\tMise sur écoute.")
self.Socket.listen(1)
print("\tAttente de connexion.")
print("Création du node terminé.")
print("\n\n")
threading.Thread(None, self.command, None, (), {}).start()#on lance le thread pour pouvoir lancer des commandes
while True:
Connexion, Address = self.Socket.accept() # accepte les connexions de l'exterieur
id_connexion=str(Address[0])+":"+str(Address[1])#on créer l'id de connexion (forme : 127.0.0.1:1024)
print("Client connecté, adresse IP %s, port %s" % (Address[0],Address[1]))
""" Puis on l'ajoute dans notre bdd """
self.Nodes[id_connexion]={
"Connexion":Connexion,
"Address":Address
}
print(self.Nodes)#on affiche les nodes
self.Nodes[id_connexion]["Connexion"].send("bienvenue. Envoyez vos messages.".encode())#on dis bonjour
threading.Thread(None, self.recv, None, (), {"Address":Address}).start()#on lance un thread qui écoute ce que le node à as dire
def recv(self,Address):
""" Fonction qui ne fait qu'afficher ce que les nodes nous envoit (Cette fonction tourne à x exemplaires (x étant le nombre de node connectés) ) """
while True:
try:
msgClient = self.Nodes[str(Address[0])+":"+str(Address[1])]["Connexion"].recv(512)#on tente de recuperer le message
except:
break#si une erreur survient on arrete d'écouter
print("C>", msgClient.decode())#on affiche le message
if msgClient.upper() == "FIN" or msgClient =="" or not msgClient:
break#si le client peut que ça s'arrete, on break aussi
self.quit(Address)#la boucle d'écoute est finie, donc c'est qu'on veut couper la connexion
def command(self):
""" Simple fonction qui tourne sans fin, et envoye le message au node indiqué en premier mot si il existe (exemple 127.0.0.1:1024 ping) """
while True:
msg_elements=input("").split()
node=msg_elements[0]
if node in self.Nodes:
del msg_elements[0]
host=node.split(":")[0]
port=int(node.split(":")[1])
self.send((host,port)," ".join(msg_elements))
else:
host=node.split(":")[0]
port=int(node.split(":")[1])
self.connect((host,port))
print("Ce node n'existe pas!")
def send(self,Address,Msg):
""" Function qui send les data """
# try:
self.Nodes[str(Address[0])+":"+str(Address[1])]["Connexion"].send(Msg.encode())
# except:
# print("Une erreur est survenue pendant l'envoi des données!")
def quit(self,Address):
""" Function utilisé pour couper une connexion """
try:
self.send(Address,"Au revoir !")#on dis au revoir
self.Nodes[str(Address[0])+":"+str(Address[1])]["Connexion"].close()#on close
except:
pass#on ignore les erreurs (exemple, si le client as déjà fermer la socket de son coté
del self.Nodes[str(Address[0])+":"+str(Address[1])]#on le supprime de la bdd
print("Connexion interrompue.")#on l'affiche
def connect(self,Address):
Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#Cette ligne corrige un problème de libération de port
Socket.connect(Address)
self.Nodes[str(Address[0])+":"+str(Address[1])]=dict()
self.Nodes[str(Address[0])+":"+str(Address[1])]["Connexion"]=Socket
threading.Thread(None, self.recv, None, (), {"Address":Address}).start()#on lance un thread qui écoute ce que le node à as dire
Node(input("Mon port seras ? : "))