2018-02-22 21:41:23 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
"""
|
|
|
|
server.py
|
|
|
|
|
|
|
|
Networking test, client-server talking script
|
|
|
|
"""
|
2018-02-27 15:04:02 +00:00
|
|
|
import select, signal, socket, sys
|
2018-02-22 21:41:23 +00:00
|
|
|
|
2018-02-22 23:34:49 +00:00
|
|
|
HOST = ''
|
2018-02-27 10:07:47 +00:00
|
|
|
PORT = 5555
|
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é"
|
2018-03-01 08:01:57 +00:00
|
|
|
MSG_DISCONNECTED = "<À quitté le chat>"
|
2018-02-27 10:07:47 +00:00
|
|
|
MSG_CLOSE_CLIENT = "Fermeture socket client {}"
|
2018-02-24 14:57:55 +00:00
|
|
|
MSG_SERVER_STOP = "Arrêt du serveur"
|
2018-02-27 15:04:02 +00:00
|
|
|
MSG_START_SERVER = "Serveur écoute sur le port {}. <ctrl+c> pour stopper le serveur."
|
2018-02-27 10:07:47 +00:00
|
|
|
MSG_WELCOME = "MSG_WELCOME".encode()
|
2018-02-24 14:57:55 +00:00
|
|
|
|
2018-02-27 10:07:47 +00:00
|
|
|
inputs = []
|
2018-02-26 00:07:00 +00:00
|
|
|
|
2018-02-27 15:04:02 +00:00
|
|
|
def handler(signum, frame):
|
|
|
|
""" Catch <ctrl+c> signal for clean stop"""
|
|
|
|
print()
|
|
|
|
inputs.remove(MAIN_CONNECTION)
|
|
|
|
for socket in inputs:
|
|
|
|
print(MSG_CLOSE_CLIENT.format(socket.getpeername()))
|
|
|
|
socket.close()
|
|
|
|
inputs.clear()
|
|
|
|
print(MSG_SERVER_STOP)
|
|
|
|
MAIN_CONNECTION.close()
|
|
|
|
sys.exit(0)
|
|
|
|
|
|
|
|
signal.signal(signal.SIGINT, handler)
|
|
|
|
|
2018-02-28 10:29:18 +00:00
|
|
|
def broadcast(sender, message):
|
|
|
|
# send message to all clients, except the sender
|
2018-03-01 08:01:57 +00:00
|
|
|
message = "\n~{}:{}~ {msg}".format(*sender.getpeername(), msg=message)
|
2018-02-28 10:29:18 +00:00
|
|
|
for socket in inputs:
|
|
|
|
if socket != MAIN_CONNECTION and socket != sender:
|
|
|
|
try:
|
|
|
|
socket.send(message.encode())
|
|
|
|
except :
|
|
|
|
socket.close()
|
|
|
|
inputs.remove(socket)
|
|
|
|
|
2018-02-26 00:07:00 +00:00
|
|
|
# Creation de la connection
|
2018-02-22 23:34:49 +00:00
|
|
|
MAIN_CONNECTION = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
2018-02-28 17:23:46 +00:00
|
|
|
MAIN_CONNECTION.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
2018-02-22 23:34:49 +00:00
|
|
|
MAIN_CONNECTION.bind((HOST, PORT))
|
|
|
|
MAIN_CONNECTION.listen(5)
|
2018-02-27 10:07:47 +00:00
|
|
|
inputs.append(MAIN_CONNECTION)
|
2018-02-26 00:07:00 +00:00
|
|
|
print(MSG_START_SERVER.format(PORT))
|
2018-02-22 23:34:49 +00:00
|
|
|
|
2018-02-27 10:07:47 +00:00
|
|
|
while 1:
|
2018-02-26 00:07:00 +00:00
|
|
|
# get the list of sockets which are ready to be read through select
|
|
|
|
# timeout 50ms
|
2018-02-27 10:07:47 +00:00
|
|
|
rlist, wlist, xlist = select.select(inputs, [], [], 0.05)
|
2018-02-26 00:07:00 +00:00
|
|
|
|
|
|
|
for socket in rlist:
|
|
|
|
# Listen for new client connection
|
|
|
|
if socket == MAIN_CONNECTION:
|
|
|
|
socket_object, socket_addr = socket.accept()
|
2018-02-27 10:07:47 +00:00
|
|
|
inputs.append(socket_object)
|
2018-02-26 00:07:00 +00:00
|
|
|
print(MSG_NEW_CLIENT.format(socket_addr))
|
2018-02-28 13:26:13 +00:00
|
|
|
broadcast(socket_object, MSG_NEW_CLIENT.format(socket_addr))
|
|
|
|
socket_object.send(MSG_WELCOME)
|
2018-02-26 00:07:00 +00:00
|
|
|
|
|
|
|
else: # receiving data
|
2018-02-27 10:07:47 +00:00
|
|
|
try:
|
|
|
|
data = socket.recv(BUFFER).decode().strip()
|
2018-02-27 15:04:02 +00:00
|
|
|
if data.upper() == "QUIT":
|
|
|
|
print(MSG_CLIENT_DISCONNECTED.format(socket.getpeername()))
|
2018-03-01 08:01:57 +00:00
|
|
|
broadcast(socket, MSG_DISCONNECTED)
|
2018-02-27 15:04:02 +00:00
|
|
|
inputs.remove(socket)
|
|
|
|
socket.close()
|
|
|
|
continue
|
|
|
|
|
|
|
|
elif data:
|
2018-02-27 10:07:47 +00:00
|
|
|
print(MSG_CLIENT_ID.format(socket.getpeername(), data))
|
2018-02-28 10:29:18 +00:00
|
|
|
broadcast(socket, data)
|
2018-02-27 10:07:47 +00:00
|
|
|
except Exception as except_detail:
|
|
|
|
print("Exception: «{}»".format(except_detail))
|
|
|
|
print(MSG_CLIENT_DISCONNECTED.format(socket.getpeername()))
|
|
|
|
import pdb; pdb.set_trace()
|
|
|
|
inputs.remove(socket)
|
|
|
|
socket.close()
|
|
|
|
continue
|
2018-02-22 21:41:23 +00:00
|
|
|
|
2018-02-22 23:34:49 +00:00
|
|
|
MAIN_CONNECTION.close()
|