Zuerst wird eine kleine Client/Server-Applikation für einen Server erstellt, der kontinuierlich auf eingehende Verbindungen hört. Außerdem wird eine Client-Applikation geschrieben, welche die Verbindung mit einem Server-Prozess herstellt und Daten überträgt. Beide Programme laufen unabhängig voneinander und können sich auf verschiedenen Hosts befinden.
Das Server-Programm beginnt damit, ein neues Serversocket-Objekt zu erzeugen, das auf einem bestimmten Port hört. (Wenn man eine Server-Applikation schreibt, wählt man einen Port, der nicht bereits für einen anderen Dienst vorgesehen ist.) Im folgenden Beispiel hört der Server auf Port 4444:
Listing A
Serversocket ist eine Java.net-Klasse, die eine systemunabhängige Implementierung der Serverseite einer Client/Server-Socket-Verbindung bereitstellt. Der Konstruktor für Serversocket löst eine Ausnahme aus, wenn er nicht auf dem angegebenen Port hören kann (zum Beispiel, weil der Port bereits verwendet wird). Wenn der Server erfolgreich eine Verbindung mit dem Port herstellt, wird das Serversocket-Objekt erzeugt, und der Server macht mit dem nächsten Schritt weiter – er nimmt eine Verbindung von einem Client an.
Listing B
Die Accept-Methode wartet, bis ein Client eine Verbindung auf dem Host und Port des Servers startet und anfragt. Wenn eine Verbindung erfolgreich angefragt und hergestellt ist, gibt die Accept-Methode ein neues Socket-Objekt zurück, das an denselben lokalen Port gebunden ist und bei dem als entfernte Adresse und entfernter Port diejenigen des Clients konfiguriert sind. Der Server kann mit dem Client über den neuen Socket kommunizieren und weiterhin auf dem originalen Serversocket auf Verbindungsanfragen vom Client hören. (Diese spezielle Version des Programms hört nicht auf weitere Verbindungsanfragen.)
Es können mehrere Client-Anfragen auf demselben Port eintreffen und entsprechend auf demselben Serversocket. Verbindungsanfragen von Clients werden am Port in die Warteschlange gestellt. Daher muss der Server Verbindungen nacheinander annehmen, kann sie jedoch gleichzeitig durch die Verwendung von Threads (das heißt ein Thread pro Client-Verbindung) bedienen. Diese Logik kommt in allen Java-Server-Applikationen für mehrere Verbindungen zum Einsatz. Zum Vergleich das folgende Beispiel:
Listing C
Der neue Thread liest aus der und schreibt in die Client-Verbindung nach Bedarf. Nachdem der Server erfolgreich eine Verbindung mit einem Client hergestellt hat, kommuniziert er mit dem Client, indem er folgenden Code verwendet:
Listing D
In diesem Fall wird der Server alle eingehenden Informationen in Antworten duplizieren, bis er den „Bye.“-String erhält. So lange sich der Server und der Client noch etwas zu sagen haben, liest und schreibt der Server vom oder in den Socket, der Nachrichten zwischen dem Client und dem Server hin- und herschickt. Danach beendet der Server die Verbindung und alle Ströme.
Listing E
Neueste Kommentare
Noch keine Kommentare zu Nahtlose Socket-Programmierung in Java
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.