commit server

main
Obai Albek 2025-09-14 05:26:04 +02:00
parent dfd55a28ea
commit 99fc00df5f
1 changed files with 36 additions and 17 deletions

View File

@ -4,39 +4,54 @@ import java.io.*;
import java.net.*; import java.net.*;
import java.util.*; import java.util.*;
/**
* Der Chat-Server verwaltet die Netzwerkverbindungen und Nachrichtenverteilung.
* Empfängt Nachrichten von Clients und verteilt sie an alle verbundenen Clients.
*/
public class ChatServer { public class ChatServer {
private static List<PrintWriter> clientWriters = new ArrayList<>(); private static List<PrintWriter> clientWriters = new ArrayList<>(); // Liste aller Client-OutputStreams
/** /**
* * Startet den Chat-Server auf Port 12345.
* Akzeptiert eingehende Client-Verbindungen und verwaltet sie in separaten Threads.
*/ */
public static void startServer() { public static void startServer() {
System.out.println("Starte Chat-Server auf Port 12345...");
try (ServerSocket serverSocket = new ServerSocket(12345)) { try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("Server läuft und wartet auf Verbindungen...");
while (true) { while (true) {
Socket clientSocket = serverSocket.accept(); Socket clientSocket = serverSocket.accept(); // Wartet auf Client-Verbindung
new Thread(new ClientHandler(clientSocket)).start(); System.out.println("Neue Client-Verbindung akzeptiert");
new Thread(new ClientHandler(clientSocket)).start(); // Startet Client-Handler
} }
} catch (IOException e) { } catch (IOException e) {
System.out.println("❌ server Fehler: " + e.getMessage()); System.out.println("Server Fehler: " + e.getMessage());
} }
} }
/** /**
* * Behandelt die Kommunikation mit einem einzelnen Client.
* Verwaltet den Nachrichtenaustausch und die Verbindung.
*/ */
private static class ClientHandler implements Runnable { private static class ClientHandler implements Runnable {
private Socket socket; private Socket socket; // Client-Socket
private PrintWriter out; private PrintWriter out; // OutputStream zum Client
private String username; private String username; // Benutzername des Clients
/**
* Konstruktor für den Client-Handler.
*
* @param socket Die Socket-Verbindung zum Client
*/
public ClientHandler(Socket socket) { public ClientHandler(Socket socket) {
this.socket = socket; this.socket = socket;
} }
/** /**
* * Hauptmethode des Client-Handlers.
* Verarbeitet eingehende Nachrichten und verwaltet die Verbindung.
*/ */
public void run() { public void run() {
try { try {
@ -44,31 +59,35 @@ public class ChatServer {
BufferedReader in = new BufferedReader( BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream())); new InputStreamReader(socket.getInputStream()));
// Erste Nachricht ist der Benutzername
username = in.readLine(); username = in.readLine();
clientWriters.add(out); clientWriters.add(out); // Fügt Client zur Broadcast-Liste hinzu
broadcast(username + " hat den Chat betreten"); // Begrüßungsnachricht
// Empfängt und verteilt Nachrichten
String message; String message;
while ((message = in.readLine()) != null) { while ((message = in.readLine()) != null) {
broadcast(username + ": " + message); // Verteilt Nachricht an alle
broadcast(username + ": " + message);
} }
} catch (IOException e) { } catch (IOException e) {
System.out.println("❌ " + username + " hat den Chat verlassen");
} finally { } finally {
// Aufräumarbeiten bei Verbindungsabbruch
clientWriters.remove(out); clientWriters.remove(out);
broadcast("👋 " + username + " hat den Chat verlassen"); broadcast(username + "hat den Chat verlassen");
try { socket.close(); } catch (IOException e) {} try { socket.close(); } catch (IOException e) {}
} }
} }
} }
/** /**
* @param message * Sendet eine Nachricht an alle verbundenen Clients.
*
* @param message Die zu sendende Nachricht
*/ */
private static void broadcast(String message) { private static void broadcast(String message) {
for (PrintWriter writer : clientWriters) { for (PrintWriter writer : clientWriters) {
writer.println(message); writer.println(message); // Sendet Nachricht an jeden Client
} }
} }
} }