2018-02-22 21:41:23 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
"""
|
|
|
|
server.py
|
|
|
|
|
|
|
|
Networking test, client-server talking script
|
|
|
|
"""
|
|
|
|
import socket
|
|
|
|
import select
|
|
|
|
|
2018-02-22 23:34:49 +00:00
|
|
|
HOST = ''
|
|
|
|
PORT = 12800
|
2018-02-25 21:36:13 +00:00
|
|
|
BUFFER = 1024
|
2018-02-22 21:41:23 +00:00
|
|
|
|
2018-02-22 23:34:49 +00:00
|
|
|
MSG_NEW_CLIENT = "Nouveau client: {}"
|
|
|
|
MSG_CLIENT_ID = "Client[{}] {}"
|
2018-02-24 14:57:55 +00:00
|
|
|
MSG_CLIENT_DISCONNECTED = "Le client {} c'est deconnecté"
|
|
|
|
MSG_SERVER_STOP = "Arrêt du serveur"
|
|
|
|
MSG_START_SERVER = "Le serveur écoute à présent sur le PORT {}"
|
|
|
|
|
|
|
|
STOP_COMMAND = "fin"
|
2018-02-22 23:34:49 +00:00
|
|
|
|
|
|
|
MAIN_CONNECTION = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
MAIN_CONNECTION.bind((HOST, PORT))
|
|
|
|
MAIN_CONNECTION.listen(5)
|
2018-02-24 14:57:55 +00:00
|
|
|
print(MSG_START_SERVER.format(PORT))
|
2018-02-22 21:41:23 +00:00
|
|
|
|
|
|
|
server_on = True
|
|
|
|
connected_clients = []
|
|
|
|
while server_on:
|
|
|
|
# On va vérifier que de nouveaux clients ne demandent pas à se connecter
|
2018-02-22 23:34:49 +00:00
|
|
|
# Pour cela, on écoute la MAIN_CONNECTION en lecture
|
2018-02-22 21:41:23 +00:00
|
|
|
# On attend maximum 50ms
|
2018-02-22 23:34:49 +00:00
|
|
|
requested_connections, wlist, xlist = select.select(
|
|
|
|
[MAIN_CONNECTION],
|
|
|
|
[], [], 0.05
|
|
|
|
)
|
2018-02-22 21:41:23 +00:00
|
|
|
|
|
|
|
for connexion in requested_connections:
|
2018-02-25 21:55:35 +00:00
|
|
|
socket_object, connection_addr = connexion.accept()
|
2018-02-22 23:34:49 +00:00
|
|
|
|
2018-02-22 21:41:23 +00:00
|
|
|
# On ajoute le socket connecté à la liste des clients
|
2018-02-25 21:55:35 +00:00
|
|
|
connected_clients.append(socket_object)
|
2018-02-22 21:41:23 +00:00
|
|
|
|
2018-02-25 21:55:35 +00:00
|
|
|
print(MSG_NEW_CLIENT.format(connection_addr))
|
2018-02-22 23:34:49 +00:00
|
|
|
|
2018-02-22 21:41:23 +00:00
|
|
|
# Maintenant, on écoute la liste des clients connectés
|
|
|
|
# Les clients renvoyés par select sont ceux devant être lus (recv)
|
|
|
|
# On attend là encore 50ms maximum
|
|
|
|
# On enferme l'appel à select.select dans un bloc try
|
|
|
|
# En effet, si la liste de clients connectés est vide, une exception
|
|
|
|
# Peut être levée
|
|
|
|
read_client_list = []
|
|
|
|
try:
|
2018-02-22 23:34:49 +00:00
|
|
|
read_client_list, wlist, xlist = select.select(
|
|
|
|
connected_clients,
|
|
|
|
[], [], 0.05
|
|
|
|
)
|
2018-02-22 21:41:23 +00:00
|
|
|
except select.error:
|
|
|
|
pass
|
|
|
|
else:
|
|
|
|
# On parcourt la liste des clients à lire
|
|
|
|
for client in read_client_list:
|
2018-02-22 23:34:49 +00:00
|
|
|
|
2018-02-22 21:41:23 +00:00
|
|
|
# Client est de type socket
|
2018-02-25 21:36:13 +00:00
|
|
|
msg_recu = client.recv(BUFFER)
|
2018-02-22 23:34:49 +00:00
|
|
|
|
2018-02-22 21:41:23 +00:00
|
|
|
# Peut planter si le message contient des caractères spéciaux
|
|
|
|
msg_recu = msg_recu.decode()
|
|
|
|
client.send(b"-ok-")
|
2018-02-22 23:34:49 +00:00
|
|
|
|
2018-02-25 21:55:35 +00:00
|
|
|
print(MSG_CLIENT_ID.format(client.getpeername(), msg_recu))
|
2018-02-22 23:34:49 +00:00
|
|
|
|
2018-02-24 14:57:55 +00:00
|
|
|
if msg_recu == STOP_COMMAND:
|
|
|
|
client.send(bytes(MSG_SERVER_STOP, 'utf8'))
|
2018-02-22 21:41:23 +00:00
|
|
|
server_on = False
|
|
|
|
|
2018-02-24 14:57:55 +00:00
|
|
|
print(MSG_SERVER_STOP)
|
2018-02-22 21:41:23 +00:00
|
|
|
for client in connected_clients:
|
|
|
|
client.close()
|
|
|
|
|
2018-02-22 23:34:49 +00:00
|
|
|
MAIN_CONNECTION.close()
|