on a adopter un mécanisme de synchronisation qui va rendre
l’adresse IP de serveur reconnu dans chaque instant , en se basant sur une api qui donne la
dernière adresse IP public du serveur à chaque fois cette dernière change on lance une requête
GET vers l’api qui fait la mise à jour de l’IP.
1. 1| Oussama ZERRYI ANDALOUSSI2019/2020
LP : SYSTEMES D'INFORMATION
ET GENIE LOGICIEL
Université Sidi Mohamed Ben Abdellah
Faculté des Sciences Dhar El Mahraz-Fès
Mécanisme d’adresse IP Dynamique C/S
I. Présentation de problématique
Lors de la mise en place des applications client-serveur à travers internet, on a toujours besoin
d’une adresse IP priver ou bien public qui doit être fixe ce qui est difficile. L’achat des adresses
IP privés ainsi que la mise en place des solutions développées sur un serveur sont très chers,
sans oublier que la nature de chaque solution doit être déployer dans un environnement bien
précis.
II. Solution informatique
Pour résoudre ce problème on va adopter un mécanisme de synchronisation qui va rendre
l’adresse IP de serveur reconnu dans chaque instant , en se basant sur une api qui donne la
dernière adresse IP public du serveur à chaque fois cette dernière change on lance une requête
GET vers l’api qui fait la mise à jour de l’IP.
L’Api est un scripte PHP hébergé dans un serveur distant gratuit qui nous donne l’accès aux
différentes ressources déployées à travers une adresse url fixe, au moment d’accès à cette api en
mode lecture, il fournira des données sous forme JSON (on a choisi ce forma parce qu’il est
reconnu par les différents langages de programmations) et l’or d’accès en mode écriture il va
faire la mise à jour de l’adresse IP.
En revanche, avant que le client se connecte au serveur, il récupère son adresse IP actuel à
travers l’api pour établir la concession, et quand le serveur change sans adresse IP on lance la
requête vers cette api pour récupérer la mise à jour.
Ce mécanise rend l’adresse IP du coter serveur et client dynamique ; sans négliger que la
connexion va être établie pour chaque instant.
1
1
1
1
2
2 2
2
Serveur Milieu - IP
Fix
Mise à jour d’IP public
2. 2| Oussama ZERRYI ANDALOUSSI2019/2020
LP : SYSTEMES D'INFORMATION
ET GENIE LOGICIEL
Université Sidi Mohamed Ben Abdellah
Faculté des Sciences Dhar El Mahraz-Fès
III. La proche informatique
Pour expérimenter cette solution on utilise le python comme langage de développement dans
les deux partis à savoir ; client et serveur, ainsi on a développé l’api par PHP pour faciliter
l’hébergement du code écrit.
1. Api développer :
2. Python scripte Server
La partie serveur contient un thread qui se charge de la synchronisation de l’adresse IP
avec le serveur milieu.
a. Récupérer l’adresse IP public
Pour récupérer l’adresse IP publique affectée au réseau du serveur , on a interrogé un
site qui nous répond par IP public sous la forme JSON.
<?php
// connexion to DB
try{
$CN = new pdo("mysql:host=localhost;dbname=id9782423_1;charset=UTF8",
"id9782423_1","123456");
}catch(Exception $e){
die('Erreur : '.$e->getMessage());
}
// test update the Ip Address in DB
if(isset($_GET["ip"])){
$smt= $CN->prepare("update ip set addr='".$_GET["ip"]."'");
$smt->execute();
}
// fetch Ip from DB and store in array
$ip=array();
foreach ($CN->query("SELECT * from ip") as $rc) {
$ip["ip"]=$rc["addr"];
}
// convert array to json format and send it on forme json content
header("content-type: application/json");
echo json_encode($ip);
?>
def getPubIp(self):
while True:
try:
external_ip = urlopen('https://ident.me').read().decode('utf8')
return external_ip
except:
print("wait to get Public Ip From Internet ...")
time.sleep(5)
3. 3| Oussama ZERRYI ANDALOUSSI2019/2020
LP : SYSTEMES D'INFORMATION
ET GENIE LOGICIEL
Université Sidi Mohamed Ben Abdellah
Faculté des Sciences Dhar El Mahraz-Fès
b. Récupérer l’adresse IP
IP courante est enregistrée dans le serveur milieu à travers l’api.
c. Mise à jour de IP
La mise à jour ce fait à travers l’api dans la base de données.
d. Mécanisme de synchronisation du coté serveur
Ce mécanisme Contient trois blocks dans une boucle while avec try pour gérer les
exceptions levées, Le premier block est en test si IP public est différente par rapport IP
enregistrer dans le serveur milieu pour faire la mise à jour et écrire sur un fichier journal.
while True:
try:
PubIp = self.getPubIp()
if self.IpServ != PubIp:
if 'U' not in self.stat.keys(): # the if for organize log file and
log printed
self.stat.clear() # organizhbhbation
print("{} | Updated from {} to
{}".format(datetime.datetime.now(), self.IpServ, PubIp))
with open('Server.log', 'a') as log:
log.write("{} | Updated from {} to
{}n".format(datetime.datetime.now(), self.IpServ, PubIp))
self.stat["U"] = "U" # organization
self.IpServ = self.updtIpServ(PubIp)
else:
def getIpServ(self):
while True:
try:
url = "https://oaz-tech.000webhostapp.com/oaz/api.php"
response = urlopen(url)
data = json.loads(response.read())
return data.get('ip')
except:
print("wait to get Ip From server ...")
time.sleep(5)
def updtIpServ(self,ip):
while True:
try:
urlopen('https://oaz-
tech.000webhostapp.com/oaz/api.php?ip={}'.format(ip))
return ip
except:
print("wait to Update Ip on server ...")
time.sleep(5)
4. 4| Oussama ZERRYI ANDALOUSSI2019/2020
LP : SYSTEMES D'INFORMATION
ET GENIE LOGICIEL
Université Sidi Mohamed Ben Abdellah
Faculté des Sciences Dhar El Mahraz-Fès
Au cas contraire, on passe au block else pour journaliser que l’IP est synchronisée.
Dans le cas d’une exception lever on l’enregistre dans le fichier journal , sinon on
attend 60 secondes et on reprend l’opération de la synchronisation.
3. Partie client.py
Cependant dans la partie client on va exploiter la fonction de getIpServ développé
dans la partie serveur pour récupérer l’IP a travers l’api
IP récupéré sera utilisée pour se connecter au serveur par le socket crée. Au cas d’une
erreur du connexion le programme va refaire le process afin d’établir la connexion.
else:
if 'S' not in self.stat.keys(): # organization
self.stat.clear() # organization
print("{} | Synchroniser sur {}".format(datetime.datetime.now(),
self.IpServ))
with open('Server.log', 'a') as log:
log.write("{} | Synchroniser sur
{}n".format(datetime.datetime.now(), self.IpServ))
self.stat["S"] = "S" # organization
except:
except:
if 'N' not in self.stat.keys(): # organization
self.stat.clear()
print("{} | No Synchroniser".format(datetime.datetime.now()))
with open('Server.log', 'a') as log:
log.write("{} | No
Synchronisern".format(datetime.datetime.now()))
self.stat["N"] = "N" # organization
time.sleep(60)
while True:
global s, con
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((getIpServ(), 9999))
print("Connexion au Serveur Etablie ...")
con = 1
while True:
print(s.recv(4096).decode("Utf8"), end="")
except:
s.close()
con=0
print("Connexion au Serveur couper. Patientez ...")
continue
5. 5| Oussama ZERRYI ANDALOUSSI2019/2020
LP : SYSTEMES D'INFORMATION
ET GENIE LOGICIEL
Université Sidi Mohamed Ben Abdellah
Faculté des Sciences Dhar El Mahraz-Fès
NB : le server doit tourner sur IP de broadcast 0.0.0.0 est le routeur doit être configurer
d’affecter l’adresse IP public a se périphérique (NAT).
On peut exploiter c’est solution pour n’importe quel projet pour assurer la connectivité.
Cas du chat à travers internet.
NB :
• Les exécutables de l’app ++C/S chat à travers internet : http://bit.ly/2wb1KjZ
• Lien GitHub du code source développer : http://bit.ly/38Pn1wZ
• Lien du rapport de solution : http://bit.ly/39V6j0x
• Email : Oussama_Andaloussi@yahoo.com