I'm trying to make the clients be able to send messages to the server, right now clients can only send messages to each other, I have added the line where datafromclient but it only receives the first input by the client, after that only the clients exchange messages.
here is my code for server.py
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(),1234))
s.listen()
print("Waiting for connections")
clients = []
unames = []
def broadcast(message):
for client in clients:
client.send(message)
def handle(client):
while True:
try:
message = client.recv(1024)
broadcast(message)
except:
index = clients.index(client)
clients.remove(client)
client.close()
uname = unames[index]
broadcast(f"{uname} left the server!".encode("utf-8"))
unames.remove(uname)
break
def receive():
while True:
client, addr = s.accept()
print(f"Connected with {str(addr)}")
client.send('uname'.encode("utf-8"))
uname = client.recv(1024).decode("utf-8")
unames.append(uname)
clients.append(client)
broadcast(f"{uname} joined the server!".encode("utf-8"))
client.send("\nWelcome to the server!".encode("utf-8"))
fOpen = open("rules.txt", "r")
client.send(fOpen.read().encode("utf-8"))
datafromclient = client.recv(1024)
print(datafromclient.decode("utf-8"))
thread = threading.Thread(target=handle, args=(client,))
thread.start()
receive()
s.close()
And this is client.py
import socket
import threading
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect((socket.gethostname(),1234))
uname = input("Username: ")
def receive():
while True:
try:
message = c.recv(1024).decode("utf-8")
if message == "uname":
c.send(uname.encode("utf-8"))
else:
print(message)
except:
print("An error occurred!")
c.close()
break
def write():
while True:
message = f'{uname}: {input("")}'
c.sendall(message.encode("utf-8"))
recv_thread = threading.Thread(target=receive)
recv_thread.start()
write_thread = threading.Thread(target=write)
write_thread.start()