commit server
parent
dfd55a28ea
commit
99fc00df5f
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue