Open jackfmaxwell opened 1 month ago
import socket from threading import Thread
serverIP = 'localhost' serverPort = 1234
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((serverIP, serverPort)) username = input("Username: ") client_socket.send(("username="+username).encode('utf-8'))
def InputThread(): while True: message=input("\nMe >") if len(message): client_socket.send(message.encode('utf-8'))
def ReceiveMessagesThread(): while True: try: message = client_socket.recv(2048).decode('utf-8') if not len(message): print("Connection closed") exit() else: print("\n"+message)
except IOError as e:
continue
if name == 'main': inputThread = Thread(target=InputThread) receivingMessagesThread = Thread(target=ReceiveMessagesThread)
inputThread.start()
receivingMessagesThread.start()
import socket import select
serverIP = '' serverPort=1234
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((serverIP, serverPort))
sockets_list = [server_socket] clients = [] client_usernames = {}
server_socket.listen(1)
while True: readsockets, , exception_sockets = select.select(sockets_list, [], sockets_list) for soc in read_sockets: if soc==server_socket: client_socket, client_address = server_socket.accept() sockets_list.append(client_socket) clients.append(client_socket) else: data = soc.recv(2048).decode('utf-8') if not data: sockets_list.remove(soc) continue
usernamemessage=False
if len(data.split('username='))>1:
username = data.split('username=')[1]
client_usernames[soc.getpeername()[1]] = username
usernamemessage=True
for client_socket in clients:
if client_socket!=soc and not usernamemessage:
client_socket.send((client_usernames[soc.getpeername()[1]]+ " | "+ data).encode('utf-8'))
Clients will only read from socket after the input is sent (since it blocks execution of loop)
Solved with threads.
sys.exit() is now exit()
Allowed users to set their username and have the server use this name when sending messages to all clients