Einleitung

TCP-Sockets sind ein grundlegendes Konzept in der Netzwerktechnik und spielen eine wesentliche Rolle bei der Kommunikation zwischen Computern über das Internet oder lokale Netzwerke. In Java sind Sockets Klassen in der java.net-Bibliothek, die es Entwicklern ermöglichen, Netzwerkkommunikation in ihren Anwendungen zu implementieren. Dieser Artikel erklärt, wie man TCP-Sockets in Java verwendet, indem sowohl eine Server- als auch eine Client-Anwendung entwickelt wird.

Grundlagen der TCP-Sockets

Was ist ein TCP-Socket?

Ein TCP-Socket ist eine Endpunkt-Instanz, die eine bidirektionale Kommunikationsverbindung zwischen zwei Programmen über ein Netzwerk ermöglicht. TCP (Transmission Control Protocol) sorgt dafür, dass Daten zuverlässig, in der richtigen Reihenfolge und ohne Fehler übertragen werden.

Wichtige Begriffe

  • Server: Das Programm, das auf Verbindungen von Clients wartet.
  • Client: Das Programm, das eine Verbindung zu einem Server initiiert.
  • Port: Eine Nummer, die verwendet wird, um verschiedene Anwendungen auf demselben Netzwerk-Host zu unterscheiden.

Entwicklung einer Server-Anwendung

Der Server ist der zentrale Teil der Kommunikation, der auf Verbindungsanfragen von Clients wartet und diese verarbeitet.

Schritt 1: Import der notwendigen Bibliotheken

import java.io.*;
import java.net.*;Code-Sprache: JavaScript (javascript)

Schritt 2: Erstellen des Server-Sockets

Ein Server-Socket wird erstellt, indem ein Objekt der Klasse ServerSocket instanziiert wird, das an einem bestimmten Port lauscht.

public class TCPServer {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(12345);
            System.out.println("Server gestartet und wartet auf Verbindungen...");

            // Der Server wartet in einer Endlosschleife auf Verbindungen
            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.out.println("Verbindung zu Client hergestellt: " + clientSocket.getInetAddress());

                // Verarbeitung der Client-Anfragen in einem separaten Thread
                new ClientHandler(clientSocket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}Code-Sprache: JavaScript (javascript)

Schritt 3: Verarbeitung der Client-Anfragen

Jede Client-Anfrage wird in einem separaten Thread verarbeitet, um gleichzeitige Verbindungen zu unterstützen.

class ClientHandler extends Thread {
    private Socket clientSocket;

    public ClientHandler(Socket socket) {
        this.clientSocket = socket;
    }

    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            String clientMessage;
            while ((clientMessage = in.readLine()) != null) {
                System.out.println("Nachricht vom Client: " + clientMessage);
                out.println("Echo: " + clientMessage);  // Echo-Antwort an den Client senden
            }

            in.close();
            out.close();
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}Code-Sprache: JavaScript (javascript)

Entwicklung einer Client-Anwendung

Der Client initiiert die Verbindung zum Server und kommuniziert mit diesem.

Schritt 1: Import der notwendigen Bibliotheken

import java.io.*;
import java.net.*;Code-Sprache: JavaScript (javascript)

Schritt 2: Erstellen des Client-Sockets und Verbindung zum Server

Ein Client-Socket wird erstellt und mit dem Server verbunden.

public class TCPClient {
    public static void main(String[] args) {
        String serverAddress = "localhost";
        int port = 12345;

        try {
            Socket socket = new Socket(serverAddress, port);
            System.out.println("Verbunden mit dem Server.");

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("Server antwortet: " + in.readLine());
            }

            in.close();
            out.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}Code-Sprache: JavaScript (javascript)

Beispielhafte Kommunikation

Angenommen, der Server läuft und wartet auf Verbindungen. Wenn der Client gestartet wird und eine Nachricht wie „Hallo, Server!“ eingibt, sieht der Ablauf wie folgt aus:

  1. Der Client sendet die Nachricht „Hallo, Server!“ an den Server.
  2. Der Server empfängt die Nachricht und sendet eine Echo-Antwort „Echo: Hallo, Server!“ zurück.
  3. Der Client empfängt die Antwort und zeigt sie an.

Zusammenfassung

In diesem Artikel haben wir die Grundlagen von TCP-Sockets in Java behandelt. Wir haben gezeigt, wie man eine einfache Server- und Client-Anwendung erstellt, die über TCP-Sockets kommunizieren. Der Server wartet auf Verbindungen und verarbeitet diese in separaten Threads, während der Client eine Verbindung initiiert und Nachrichten sendet und empfängt. Dies bildet die Basis für komplexere Netzwerkkommunikationsanwendungen in Java.