Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
client.py 2.95 KiB
import socket
import threading
from datetime import datetime

MULTICAST_GROUP_IP = '224.1.1.1'

# Broadcast address and port

CLIENT_MULTICAST_PORT = 5973

# Local host information
MY_HOST = socket.gethostname()
MY_IP = socket.gethostbyname(MY_HOST)

class Client():
    def __init__(self):
        self.currentLeader = ''
        self.server_socket = None

    # print the current date and time
    def printwt(self, msg):
        current_date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        print(f'[{current_date_time}] {msg}')    

    # dynamic discoverey: client sends request to server group and gets the IP of server as reply
    def MulticastSendAndReceive(self):
        # Create a UDP socket
        multicast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        # Set the time-to-live for messages to 1 so they do not go past the local network segment
        multicast_socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 1)

        # Send message on multicast address
        message = 'New client wants to connect: ' + MY_IP
        multicast_socket.sendto(str.encode(message), (MULTICAST_GROUP_IP, CLIENT_MULTICAST_PORT))

        self.printwt("Sent my IP to server group")

        while True:     
            try:
                # receive reply data (server IP) from the other participants
                reply, addr = multicast_socket.recvfrom(1024)

                if reply:
                    # decode received data
                    reply_addr = reply.decode()
                    self.currentLeader = reply_addr
                    self.printwt(f'Got Leader address: {self.currentLeader}')

                    # Connect to the server using TCP
                    self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    self.server_socket.connect((self.currentLeader, 5555))
                    print("You have entered the chat room")

                     # Starte einen Thread, um Nachrichten zu empfangen
                    receive_thread = threading.Thread(target=self.receive_messages)
                    receive_thread.start()

                    # Haupt-Thread zum Senden von Nachrichten
                    while True:
                        message = input()
                        timestamped_message = f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] {message}'
                        self.server_socket.send(timestamped_message.encode('utf-8'))
                        
            except socket.timeout:
                pass

    def receive_messages(self):
        while True:
            try:
                data = self.server_socket.recv(1024)
                if not data:
                    break
                print(data.decode('utf-8'))
            except:
                break




# starting all simultaneously working procedures
if __name__ == "__main__":
    client = Client()

    thread1 = threading.Thread(target = client.MulticastSendAndReceive)
    thread1.start()
    thread1.join()