Serversockets und Thread-Communication

blackson1c

Grünschnabel
Hallo, ich versuche mich gerade in das Thema Server Clien Kommunikation über Socketzs einzuarbeiten und habe zwei Fragen:

1: Ich habe mich an dem Beispiel des einfachen Echo Servers versucht

PHP:
import java.net.*;
import java.io.*;

public class EchoServer {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;
	int port=1100;
        try {
            serverSocket = new ServerSocket(port);
        } catch (IOException e) {
            System.err.println("port " + port + "ist belegt");
            System.exit(1);
        }

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Fehler bei der Annahme der Verbindung");
            System.exit(1);
        }

        PrintWriter zumClient = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader vomClient = new BufferedReader(
				new InputStreamReader(
				clientSocket.getInputStream()));
        String ein;
        zumClient.println("Hallo, hier ist der Echo-Server");

        while ((ein = vomClient.readLine()) != null) {
             zumClient.println("Vom Server " + ein);
        }
        zumClient.close();
        vomClient.close();
        clientSocket.close();
        serverSocket.close();
    }
}

Was muss man machen damit dieses Programm (jar) unter Linux ständig im hintergrund läuft, ohne sich zu beenden (Also auch wenn ich mich Abmelde ) ? Wenn ich einfach nur aus der console java -jar [datei] ausführe und mich dann abmelde /anmelde ist der Server danach aus.

2 Frage:
Den obigen Code kann man auch erweitern, so dass die Einzellnen Clients ihren eigenen Thread bekommen. und noch weitere Thread im Hintergrund Laufen. Wie funktioniert dann die kommunikation zwischen den internen Threads des Servers ?

Um es besser zu verdäutlichen auf was ich hinauswill:

Scenario:
1) Von Client aus wird ein Start oder Stop befehl an Server geschickt.

2) Der Start\Stop Befehl startet einen neuen Thread A oder stopt einen bereits laufenden Thread A im Server. Der Thread A soll aber unabhängig davon arbeiten, ob Clients angemeldet oder ausgeschaltet werden. Thread A soll nach dem start ständigt eine DB mit Daten fühlen.

3) Es gibt einen zweiten Thread B im Server der das aktuelle Datum überwacht. Falls das Ende des Tages erreicht wird, soll er Thread A unterbrechen und eine neue DB Anlegen für den Neuen Tag. Und den Thread A anschließend weiter laufen lassen.

Wie funktioniert da die Kommunikation zwischen den internen Threads?

Weil ich habe die einzellnen Funktion für den DB Zugriff und die Zeitsteuerung schon fertig, aber bekomme es nicht hin das das ganze im Server Client Umgebung mit einander Funktioniert bzw kommuniziert.


Danke schon mal für Hilfe.
 
Zuletzt bearbeitet:
Was muss man machen damit dieses Programm (jar) unter Linux ständig im hintergrund läuft, ohne sich zu beenden (Also auch wenn ich mich Abmelde ) ? Wenn ich einfach nur aus der console java -jar [datei] ausführe und mich dann abmelde /anmelde ist der Server danach aus.
In den gebräuchlichen Shells kann man ein Kaufmannsund "&" an den Befehl anhängen um den Befehl im Hintergrund auszuführen.
Ein vorangestelltes "nohup" entkoppelt den Befehlt von dem "Auflegensignal" der aktiven Konsole z.B. beim Abmelden.
Weitere Infos:
http://www.informatikserver.at/selflinux/html/bash_basic06.html

Den obigen Code kann man auch erweitern, so dass die Einzellnen Clients ihren eigenen Thread bekommen. und noch weitere Thread im Hintergrund Laufen. Wie funktioniert dann die kommunikation zwischen den internen Threads des Servers ?

Die Sockets können zum kommunizieren verwendet werden. Client schreibt in seinem eigenen Thread auf den Socket des Servers. Server liest in seinem eigenen Thread.
Über Objektreferenzen kann auch kommuniziert werden. Eine verwaltende Klasse könnte eine Reihe von Clients erzeugen und deren Referenzen speichern. Über die Referenz könnten dann die einzelnen Client gestopt und gestartet werden.
 
Zurück