AlphaCodingCode / chatroom

0 stars 0 forks source link

Clients only receive messages after inputting #1

Open jackfmaxwell opened 1 month ago

jackfmaxwell commented 1 month ago

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

jackfmaxwell commented 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()
jackfmaxwell commented 1 month ago

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 = {}

client_usernames[63299] = "Test"

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'))