Skip to content
Snippets Groups Projects
Commit c950f133 authored by Rafael Schindler's avatar Rafael Schindler
Browse files

Merge branch 'main' into Rafael

parents 0074858f cd437941
No related branches found
No related tags found
No related merge requests found
import socket import socket
import threading import threading
from datetime import datetime
def receive_messages(): # Broadcast address and port
while True: BROADCAST_IP = "192.168.0.255"
try: BROADCAST_PORT = 5973
# Empfange Nachricht vom Server
data = client_socket.recv(1024) # Local host information
print(data.decode('utf-8')) MY_HOST = socket.gethostname()
except: MY_IP = socket.gethostbyname(MY_HOST)
break
# Client-Konfiguration
host = '127.0.0.1' class Client():
port = 5555 def __init__(self):
self.currentLeader = ''
# Verbinde zum Server self.server_socket = None
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, port)) # print the current date and time
print(f'Du bist jetzt im Chat') def printwt(self, msg):
current_date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f'[{current_date_time}] {msg}')
# Starte einen Thread, um Nachrichten vom Server zu empfangen
receive_thread = threading.Thread(target=receive_messages) # dynamic discoverey: client sends request to server group and gets the IP of server as reply
receive_thread.start() def BroadcastSendAndReceive(self):
# Haupt-Thread zum Senden von Nachrichten message = 'New client wants to connect: ' + MY_IP
while True:
message = input() # Create a UDP socket
client_socket.send(message.encode('utf-8')) broadcast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Send message on broadcast address
broadcast_socket.sendto(str.encode(message), (BROADCAST_IP, BROADCAST_PORT))
# Send broadcast message
self.printwt("Sent my IP to server group")
while True:
try:
# receive reply data (server IP) from the other participants
reply, addr = broadcast_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.BroadcastSendAndReceive)
thread1.start()
thread1.join()
\ No newline at end of file
import socket import socket
import threading import threading
from datetime import datetime
def handle_client(client_socket, client_address): # Listening port
while True: BROADCAST_PORT = 5973
try:
# Empfange Nachricht vom Client # Local host information
data = client_socket.recv(1024) MY_HOST = socket.gethostname()
if not data: MY_IP = socket.gethostbyname(MY_HOST)
break
class Server():
def __init__(self):
self.leader_IP = '' # fix the leader IP
self.clients = []
def printwt(self, msg):
current_date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f'[{current_date_time}] {msg}')
# Listen to client broadcast (request) and reply with Server IP
def ListenForClientAndReply(self):
# Create a UDP socket
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Set the socket to broadcast and enable reusing addresses
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# Bind socket to address and port
listen_socket.bind((MY_IP, BROADCAST_PORT))
print("Listening to broadcast messages")
# Sende die empfangene Nachricht an alle anderen Clients # Receiving broadcast massage
broadcast(data, client_socket, client_address) while True:
except: data, addr = listen_socket.recvfrom(1024)
break
# Client-Socket schließen if data:
client_socket.close() self.printwt(data.decode())
def broadcast(message, sender_socket, sender_address): # if Iam the leader, answer the client including my IP
for client in clients: # if MY_IP == self.leader_IP:
try: if data:
# Sende die Nachricht an alle Clients, außer an den Absender reply_message = MY_IP
if client != sender_socket: listen_socket.sendto(str.encode(reply_message), addr)
client.send(f"{sender_address}: {message}".encode('utf-8')) self.printwt('Replied my IP to new client')
except:
# Entferne defekte Verbindungen
clients.remove(client)
# Server-Konfiguration def handle_client(self, client_socket, client_address):
host = '127.0.0.1' self.clients.append(client_socket)
port = 5555
# Socket erstellen und binden while True:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try:
server_socket.bind((host, port)) data = client_socket.recv(1024)
server_socket.listen(5) if not data:
break
self.broadcast(data, client_socket)
except:
self.clients.remove(client_socket)
break
def broadcast(self, message, sender_socket):
for client in self.clients:
try:
if client != sender_socket:
client.send(message)
except:
self.clients.remove(client)
print(f'Server lauscht auf {host}:{port}')
# Liste für die verbundenen Clients # starting all simultaneously working procedures
clients = [] if __name__== '__main__':
server = Server()
while True: thread1 = threading.Thread(target = server.ListenForClientAndReply)
# Warten auf eine Verbindung thread1.start()
client_socket, client_address = server_socket.accept()
# Neuen Thread für jeden verbundenen Client erstellen # Socket erstellen und binden
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address)) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_thread.start() server_socket.bind((MY_IP, 5555))
server_socket.listen(5)
while True:
client_socket, client_address = server_socket.accept()
# Client-Socket zur Liste hinzufügen client_thread = threading.Thread(target=server.handle_client, args=(client_socket, client_address))
clients.append(client_socket) client_thread.start()
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment