juu leuft

This commit is contained in:
Michael S. 2023-11-30 16:39:00 +01:00
parent d8c4d6cc79
commit d2af9fc1f7
2 changed files with 54 additions and 43 deletions

View file

@ -1,20 +1,28 @@
import socket import socket
import threading import threading
from random import randint
# Server-Informationen # Server-Informationen
HOST = '127.0.0.1' HOST = '127.0.0.1'
PORT = 12345 PORT = 12345
nickname = "michi"
nickname = input("username:")
if nickname == "":
nickname = ["tux","gnu","wilber","xue","puffy"][randint(0,4)]
nickname += str(randint(1000,9999))
print(f"dein username wurde zu {nickname} gesetzt.")
run = True
def receive_message(sock): def receive_message(sock):
""" Funktion für das Empfangen von Nachrichten """ """ Funktion für das Empfangen von Nachrichten """
while True: global run
while run:
try: try:
# Empfange die Nachricht des Servers # Empfange die Nachricht des Servers
msg = sock.recv(1024).decode('utf-8') msg = sock.recv(1024).decode('utf-8')
if not msg: if not msg:
break break
print(f"\r>>{msg}\n", end='', flush=True) print(f"\r{msg}\n", end='', flush=True)
except: except:
# Schließe die Verbindung, wenn ein Fehler auftritt # Schließe die Verbindung, wenn ein Fehler auftritt
print("Verbindung getrennt.") print("Verbindung getrennt.")
@ -22,26 +30,30 @@ def receive_message(sock):
def start_client(): def start_client():
""" Funktion für das Starten des Clients """ """ Funktion für das Starten des Clients """
global run
# Erstelle den Client-Socket und verbinde ihn mit dem Server # Erstelle den Client-Socket und verbinde ihn mit dem Server
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT)) client.connect((HOST, PORT))
# Starte einen Thread für das Empfangen von Nachrichten # Starte einen Thread für das Empfangen von Nachrichten
threading.Thread(target=receive_message, args=(client,)).start() threading.Thread(target=receive_message, args=(client,), daemon=True).start()
client.sendall(nickname.encode('utf-8')) client.sendall(nickname.encode('utf-8'))
while run:
try: try:
while True: msg = input(">>")
# Lese die Eingabe des Benutzers und sende sie an den Server
msg = input(">> ")
if msg.lower() == "exit": if msg.lower() == "exit":
run = False
print("BEENDEN")
break break
client.sendall(msg.encode('utf-8')) client.sendall(msg.encode('utf-8'))
except KeyboardInterrupt: except KeyboardInterrupt:
pass run = False
finally: print("\rBEENDEN")
# Schließe den Client-Socket break
client.close() except:
break
if __name__ == '__main__': if __name__ == '__main__':
start_client() start_client()

View file

@ -8,50 +8,50 @@ PORT = 12345
# Erstelle den Server-Socket # Erstelle den Server-Socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT)) server.bind((HOST, PORT))
nicks = {}
# Liste für die Verfolgung der Clients # Liste für die Verfolgung der Clients
clients = [] clients = []
def sendanall(conn, msg):
for client in clients:
if client != conn:
try:
client.sendall(msg.encode('utf-8'))
except BrokenPipeError:
print("pipe error")
pass
def handle_client(conn, addr): def handle_client(conn, addr):
""" Funktion für die Behandlung eines einzelnen Clients """ """ Funktion für das Behandeln eines einzelnen Clients """
nick = conn.recv(1024).decode('utf-8')
print(f"Neuer Client verbunden: {addr} (Nickname: {nick})")
sendanall(conn, f"{nick} hat den Chat betreten")
# Füge den Client zur Liste hinzu # Füge den Client zur Liste hinzu
clients.append(conn) clients.append(conn)
#Nick_given = False
#while Nick_given == True:
# try:
# # Empfange den nickname des Clients
# msg = conn.recv(1024).decode('utf-8')
# if not msg:
# break
# print(clients)
# print(f"Nick von {addr}: {msg}")
# global nicks
# nicks[addr] = msg
# Nick_given = True
# except:
# # Entferne den Client aus der Liste und schließe die Verbindung
# print("Client getrennt:", addr)
# clients.remove(conn)
# conn.close()
# break
print("Neuer Client verbunden:", addr)#,nicks[addr])
while True: while True:
try: try:
# Empfange die Nachricht des Clients # Empfange die Nachricht des Clients
msg = conn.recv(1024).decode('utf-8') msg = conn.recv(1024).decode('utf-8')
if not msg: if not msg:
break break
elif msg == "exit":
print("Client getrennt:", addr)
sendanall(conn, f"{nick} hat den Chat verlassen")
clients.remove(conn)
conn.close()
break
print(clients) print(clients)
print(f"Nachricht von {addr}: {msg}") print(f"Nachricht von {addr}: {msg}")
# Sende die Nachricht an alle anderen Clients
for client in clients: # Überprüfe, ob das Socket noch geöffnet ist, bevor Sie versuchen zu senden
if client != conn: if conn.fileno() != -1:
client.sendall(msg.encode('utf-8')) sendanall(conn, f"<{nick}>:{msg}")
except: except ConnectionResetError:
# Entferne den Client aus der Liste und schließe die Verbindung # Wenn eine Verbindungsreset-Ausnahme auftritt (Client beendet ohne "exit" zu senden)
print("Client getrennt:", addr) print("Client getrennt (Verbindungsreset):", addr)
sendanall(conn, f"{nick} hat den Chat verlassen")
clients.remove(conn) clients.remove(conn)
conn.close() conn.close()
break break
@ -72,4 +72,3 @@ if __name__ == '__main__':
except KeyboardInterrupt: except KeyboardInterrupt:
print("Server wird heruntergefahren.") print("Server wird heruntergefahren.")
server.close() server.close()