I've created a server file, that keeps waiting for clients. When someone connects to the server, he can send messages to the server, and from the server it is broadcasted to all clients.
Can you criticize my simple chat? Any possible improvements and changes are welcome. I have 2 files:
Server:
import threading
import socket
text_type = "utf-8"
host = str(socket.gethostbyname(socket.gethostname()))
port = 5050
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((host,port))
server.listen(4)
clients = []
names = []
#This function sends message to all clients on room
def broadcast(msg):
for i in clients:
message = msg.encode(text_type)
i.send(message)
#This function waits until someone send a message, and then pass it to broadcast()
def get_message(client_reference):
while True:
try:
message = client_reference.recv(1024).decode(text_type)
broadcast(message)
except:
index = clients.index(client_reference)
clients.remove(client_reference)
client_reference.close()
name = names[index]
broadcast(f"{name} left the chat.".encode(text_type))
names.remove(name)
break
#This function waits to new clients, and then store their name and other informations
def new_client():
while True:
client_reference,client_info = server.accept()
name = client_reference.recv(1024).decode(text_type)
print(f"Connected with {name}, {client_info}")
names.append(name)
clients.append(client_reference)
client_reference.send(str(f"Welcome {name}.").encode(text_type))
broadcast(str(f"{name} joined the chat."))
thread = threading.Thread(target=get_message, args=[client_reference])
thread.start()
new_client()
Client:
import socket
import threading
text_type = "utf-8"
server_ip = "192.168.1.6"
port = 5050
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((server_ip,port))
name = str(input("Type your name: "))
client.send(name.encode('utf-8'))
#This function gets other clients messages, so any client has access to all messages
def messages():
while True:
try:
message = client.recv(1024).decode(text_type)
print(message)
except:
print("ERROR")
client.close()
break
#This function waits for the user input(message)
def write():
while True:
text = str(input("Digit a message: "))
message = str(f"{name}: {text}")
client.send(message.encode(text_type))
receive_thread = threading.Thread(target=messages)
receive_thread.start()
write_thread = threading.Thread(target=write)
write_thread.start()
```