Java-Beispiele - Socket-Implementierung eines Multithread-Serverprogramms

Java-Beispiele

In Java kann die Implementierung eines Multithread-Serverprogramms durch die Verwendung vonServerSocketum auf Client-Verbindungen zu warten. Immer wenn sich ein neuer Client verbindet, wird ein neuer Thread gestartet, um diese Verbindung zu verarbeiten. Unten sehen Sie einen Beispielcode, der zeigt, wie man Java Socket verwendet, um ein Multithread-Serverprogramm zu implementieren.

Serverseitiger Code

Zuerst erstellen wir ein serverseitiges Programm, das auf einem angegebenen Port lauscht und für jede Client-Verbindung einen neuen Thread startet, um die Kommunikation zu verarbeiten.

MultiThreadedServer.java-Datei

import java.io.*; import java.net.*; public class MultiThreadedServer { public static void main(String[] args) { int port = 12345; //Serverport definieren try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("Server gestartet, warte auf Client-Verbindungen..."); while (true) { Socket clientSocket = serverSocket.accept(); //Client-Verbindung annehmen System.out.println("Client verbunden:" + clientSocket.getInetAddress().getHostAddress()); //Für jede Client-Verbindung einen neuen Thread starten ClientHandler clientHandler = new ClientHandler(clientSocket); new Thread(clientHandler).start(); } } catch (IOException e) { e.printStackTrace(); } } } class ClientHandler implements Runnable { private Socket clientSocket; public ClientHandler(Socket socket) { this.clientSocket = socket; } @Override public void run() { try ( InputStream input = clientSocket.getInputStream(); OutputStream output = clientSocket.getOutputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); PrintWriter writer = new PrintWriter(output, true) ) { String clientMessage; while ((clientMessage = reader.readLine()) != null) { System.out.println("Empfangene Client-Nachricht:" + clientMessage); writer.println("Serverantwort:" + clientMessage); //Sende die Antwortnachricht an den Client } } catch (IOException e) { e.printStackTrace(); } finally { try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }

Clientseitiger Code

Der Client-Code wird verwendet, um eine Verbindung zum Server herzustellen und Nachrichten zu senden. Sie können mehrere Clients erstellen, um die Multithreading-Fähigkeit des Servers zu testen.

Code der Datei Client.java:

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        String serverAddress = "localhost";
        int port = 12345; // Server-Port

        try (Socket socket = new Socket(serverAddress, port)) {
            System.out.println("Connected to server");

            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));

            String userInput;
            while ((userInput = consoleReader.readLine()) != null) {
                writer.println(userInput);
                String serverResponse = reader.readLine();
                System.out.println("Serverantwort: " + serverResponse);
            }
        } catch (UnknownHostException e) {
            System.err.println("Unbekannter Host: " + serverAddress);
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("Keine I/O-Verbindung möglich zu: " + serverAddress);
            e.printStackTrace();
        }
    }
}

Ausführungsschritte

  1. Serverseite ausführen:

    • Kompilieren und ausführenMultiThreadedServerclass.
    • Der Server startet und lauscht am angegebenen Port auf Client-Verbindungen.
  2. Client ausführen:

    • Kompilieren und führen Sie mehrereClientKlasseninstanzen aus, um mehrere Clients zu simulieren, die sich mit dem Server verbinden.
    • Geben Sie eine Nachricht in der Client-Konsole ein. Der Client sendet die Nachricht an den Server, und der Server antwortet mit derselben Nachricht.

Erklärung

  • ServerSocket: Der Socket, der auf der Serverseite verwendet wird, um auf Client-Verbindungen zu lauschen.
  • Socket: Der Kommunikationskanal zwischen dem Client und dem Server.
  • ClientHandler: Die Thread-Klasse, die jede Client-Verbindung behandelt.
  • BufferedReaderundPrintWriter: Wird zum Lesen und Schreiben von Datenströmen verwendet.

Diese Implementierung stellt sicher, dass der Server mehrere Client-Verbindungen gleichzeitig verarbeiten kann, ohne dass eine lang andauernde Operation eines Clients die Anfragen anderer Clients blockiert.

Kompilieren Sie den Code

Öffnen Sie ein Terminal oder eine Eingabeaufforderung, wechseln Sie in das Verzeichnis, das die obige Java-Datei enthält, und kompilieren Sie den Code:

javac MultiThreadedServer.java Client.java

Nach Abschluss der Kompilierung führen Sie zuerst das Serverprogramm aus. Der Server startet und beginnt, auf Port 12345 zu lauschen.

java MultiThreadedServer

Sie sehen die Serverausgabe:

Server started, waiting for client connection...

Öffnen Sie ein weiteres Terminal- oder Eingabeaufforderungsfenster und führen Sie das Client-Programm aus. Sie können mehrere Client-Instanzen ausführen, um die Multithread-Verarbeitung zu testen.

java Client

Sie sehen die Client-Ausgabe:

Connected to server

Dann können Sie eine Nachricht in der Client-Konsole eingeben, zum Beispiel:

Hello Server

Der Server wird antworten:

服务器回应: Hello Server

Die serverseitige Ausgabe wird angezeigt:

客户端已连接: 127.0.0.1
收到客户端消息: Hello Server

Java-Beispiele

Andere Erweiterungen