Ask for username and use it

First client's message is used as usernane in server loging and other
clients broadcasting
This commit is contained in:
Fred Z 2018-03-04 00:58:56 +01:00
parent 3c5c169045
commit 870953051d
2 changed files with 28 additions and 9 deletions

View File

@ -9,7 +9,7 @@
- [x] ~~sending welcome message only at 1st client connection FIX #20~~
- [x] ~~client freeze when sending empty string or spaces~~
- [x] ~~move closing connection at the script's end~~
- [ ] asking/using client-nickname
- [x] ~~asking/using client-nickname~~
- [ ] clean the prompt and std.out a bit messy since broadcasting
- [ ] using wlist with select.select for hardening the script
- [ ] …

View File

@ -13,15 +13,17 @@ PORT = 5555
BUFFER = 1024
MSG_NEW_CLIENT = "Nouveau client: {}"
MSG_CLIENT_ID = "Client[{}] {}"
MSG_CLIENT_ID = "Client[{}:{} @{name}] {msg}"
MSG_CLIENT_DISCONNECTED = "Le client {} c'est deconnecté"
MSG_DISCONNECTED = "<À quitté le chat>"
MSG_CLOSE_CLIENT = "Fermeture socket client {}"
MSG_SERVER_STOP = "Arrêt du serveur"
MSG_START_SERVER = "Serveur écoute sur le port {}. <ctrl+c> pour stopper le serveur."
MSG_WELCOME = "MSG_WELCOME".encode()
MSG_USER_IN = "<entered the chatroom>"
MSG_WELCOME = "Welcome. First do something usefull, type your name: ".encode()
inputs = []
user_name = []
def handler(signum, frame):
""" Catch <ctrl+c> signal for clean stop"""
@ -37,9 +39,9 @@ def handler(signum, frame):
signal.signal(signal.SIGINT, handler)
def broadcast(sender, message):
def broadcast(sender, name, message):
# send message to all clients, except the sender
message = "\n~{}:{}~ {msg}".format(*sender.getpeername(), msg=message)
message = "\n~{}~ {}".format(name, message)
for socket in inputs:
if socket != MAIN_CONNECTION and socket != sender:
try:
@ -54,6 +56,7 @@ MAIN_CONNECTION.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
MAIN_CONNECTION.bind((HOST, PORT))
MAIN_CONNECTION.listen(5)
inputs.append(MAIN_CONNECTION)
user_name.append("MAIN_CONNECTION")
print(MSG_START_SERVER.format(PORT))
while 1:
@ -66,18 +69,34 @@ while 1:
if socket == MAIN_CONNECTION:
socket_object, socket_addr = socket.accept()
inputs.append(socket_object)
user_name.append(False)
print(MSG_NEW_CLIENT.format(socket_addr))
broadcast(socket_object, MSG_NEW_CLIENT.format(socket_addr))
socket_object.send(MSG_WELCOME)
else: # receiving data
data = socket.recv(BUFFER).decode().strip()
peername = socket.getpeername()
s_idx = inputs.index(socket)
uname = user_name[s_idx]
if data.upper() == "QUIT":
print(MSG_CLIENT_DISCONNECTED.format(socket.getpeername()))
broadcast(socket, MSG_DISCONNECTED)
broadcast(socket, uname, MSG_DISCONNECTED)
inputs.remove(socket)
user_name.pop(s_idx)
socket.close()
elif user_name[s_idx] is False: # setting username
# insert username naming rule here
user_name[s_idx] = data
socket.send("Hi, {}".format(user_name[s_idx]).encode())
print(MSG_CLIENT_ID.format(*peername, name=data, msg=""))
broadcast(socket, user_name[s_idx], MSG_USER_IN)
elif data:
print(MSG_CLIENT_ID.format(socket.getpeername(), data))
broadcast(socket, data)
print(MSG_CLIENT_ID.format(*peername, name=uname, msg=data))
broadcast(socket, uname, data)
else:
print("Server encountered an unknown case")
import pdb; pdb.set_trace()