-
Quoc Nguyen Dao authoredQuoc Nguyen Dao authored
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()