Skip to content

4. Peer To Peer - Projekt

1. Server als zentrale Verwaltungseinheit

Anforderung: Der Server dient als Adressverzeichnis. Clients registrieren sich mit Nickname und UDP-Port, um Peer-Verbindungen zu ermöglichen.

Umsetzung:

  • Client sendet beim Verbinden:

    self.sock.sendall(build_message("REGISTER", self.nickname.get(), str(self.udp_port)).encode())
    

  • Server speichert Nickname, IP und UDP-Port, verweigert doppelte Nicknames:

    if nickname in self.clients:
        conn.sendall(build_message("ERROR", "Nickname bereits vergeben").encode())
    


2. Broadcast-Nachrichten an alle Teilnehmer

Anforderung: Nachrichten sollen über den Server an alle verbundenen Clients verteilt werden.

Umsetzung:

  • Client sendet BROADCAST an Server:

    self.sock.sendall(build_message("BROADCAST", self.nickname.get(), message).encode())
    

  • Server verteilt Nachricht an alle anderen:

    for nick, (conn, _, _) in self.clients.items():
        if nick != sender:
            conn.sendall(build_message("BROADCAST_MSG", sender, message).encode())
    


3. Anzeige der verbundenen Teilnehmer

Anforderung: Jeder Client soll sehen, welche Benutzer verbunden sind, inklusive IP & UDP-Port.

Umsetzung:

  • Server sendet USERLIST:

    def send_userlist_initial(self, conn):
        entries = [f"{n}:{ip}:{u}" for n, (_, ip, u) in self.clients.items()]
        conn.sendall(build_message("USERLIST", *entries).encode())
    

  • Client zeigt Einträge in einer Listbox:

    self.user_list.insert(tk.END, f"{nick}:{ip}:{udp}")
    


4. Aufbau privater Chats über UDP und TCP

Anforderung: Clients sollen private Direktverbindungen aufbauen können (Verbindungsaufbau über UDP, Kommunikation über TCP).

Umsetzung:

  • Chat-Anfrage per UDP:

    s.sendto(f"CHAT_REQUEST {tcp_port}".encode(), (target_ip, target_udp_port))
    

  • Nach Annahme erfolgt TCP-Verbindung:

    conn.connect((ip, port))
    conn.sendall(self.nickname.get().encode())  # Sende eigenen Nickname
    


5. Verwaltung paralleler Direktverbindungen

Anforderung: Mehrere Direktverbindungen sollen möglich sein, aber gleiche Usernamen/IP-Port-Kombis dürfen sich nicht doppelt verbinden.

Umsetzung:

  • Serverseite:

    if nickname in self.clients:
        # Verbindungsversuch mit vergebenem Nickname wird abgelehnt
    

  • Clientseite:

    if self.running:
        self.log("[INFO] Bereits verbunden – mehrfaches Verbinden nicht erlaubt.")
    


6. Trennung privater Chats

Anforderung: Wenn ein Chat-Partner das Fenster schließt, soll der andere informiert werden.

Umsetzung:

  • Beim Schließen wird eine spezielle Nachricht gesendet:

    conn.sendall("[DISCONNECT]\n".encode())
    

  • Empfangende Seite zeigt Hinweis:

    if decoded == "[DISCONNECT]":
        log_chat(f"[INFO] {peer_nickname} hat den Chat beendet.")
    


🔗 Project Repository

👉 Click here to download or view the full source code on GitHub


Beispielhafte Vorführung

P2P1.PNG

P2P2.PNG

P2P3.PNG

P2P4.PNG