Skip to content
Snippets Groups Projects
Select Git revision
  • 0f360c068d7a5ed424c89c129668e6f672426c5e
  • main default protected
2 results

client.py

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    client.py 3.62 KiB
    import multiprocessing
    import socket
    import threading
    import re
    
    class Client(multiprocessing.Process):
    
        registered_server = None
        host = socket.gethostname()
        client_address = socket.gethostbyname(host)
    
        def __init__(self):
            self.run()
    
        def run(self):
            print("Client: Up and running")
            action = input("Client: Enter type of action ('r' to register): ")
            if (action == "r"):
                group = input("Client: Which group dou you want to join? ")
                self.register("register", group)
    
                send_thread = threading.Thread(target=self.send_message)
                receive_thread = threading.Thread(target=self.receive_messages)
                receive_new_server_thread = threading.Thread(target=self.receive_new_server)
    
                send_thread.start()
                receive_thread.start()
                receive_new_server_thread.start()
    
                # waiting for thread to stop = prevent the programm from shutdown before thread is stopped
                send_thread.join()
                receive_thread.join()
    
            else: 
                message = input("Client: Enter message:")
                print(message)
    
        def register(self, message_type, message_group):
            PORT = 49153
    
            MSG = bytes(message_type + '_' + message_group, 'utf-8')
    
            broadcast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    
            broadcast_socket.sendto(MSG, ('<broadcast>', PORT))
            
            data, server = broadcast_socket.recvfrom(1024)
            
            print('Client: Received message from server: ', data.decode('utf-8'))
    
            # search for server ip_address in message from server
            ip_pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'
            matches = re.findall(ip_pattern, data.decode('utf-8'))
    
            # 2nd ip address in message from server is server address
            self.registered_server_address = matches[1]
            
            #self.registered_server = server
            print("Client: My server: ", self.registered_server_address)
    
            broadcast_socket.close()
    
        def send_message(self):
            PORT = 50001
    
            while True:
                message = input()
                if message.lower() == 'exit':
                    break
                
                client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                client_socket.connect((self.registered_server_address, PORT))
                client_socket.sendall(bytes(message, 'utf-8'))
                client_socket.close() 
    
        def receive_messages(self):
            PORT = 51000
    
            client_receive_message_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            client_receive_message_socket.bind((self.client_address, PORT))
            client_receive_message_socket.listen()
    
            print("Client: Listening for groupchat messages")
    
            while True:
                connection, addr = client_receive_message_socket.accept()
                message = connection.recv(1024)
                #print(f"GC message: {message.decode('utf-8')}")
                print(message.decode('utf-8'))
    
        def receive_new_server(self):
            PORT = 52000
    
            client_receive_message_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            client_receive_message_socket.bind((self.client_address, PORT))
            client_receive_message_socket.listen()
    
            print("Client: Listening for server address update messages")
    
            while True:
                connection, addr = client_receive_message_socket.accept()
                message = connection.recv(1024)
                print(f"Client: New server: {message.decode('utf-8')}")
                self.registered_server_address = message.decode('utf-8')