# mehrere Prozesse/Threads oder Programme, Kommunikation untereinander



## EdWood1 (27. August 2007)

hallo
Ich muss gleich mal erwähnen, dass ich nicht viel Ahnung von der Materie hab.
Aber wie geht man grundsätzlich so ein folgendes Problem an:
ein Programm/Prozess/Thread...(?) läuft ständig im Hintergrund (um z.b. ständig ne Netzwerkverbindung aufrechtzuerhalten), ein zweites Programm/Prozess/Thread...(?) kann gestartet werden, nutzt diese Netzwerkverbingung (kommuniziert also mit dem Hintergrundprozess), und wird wieder beendet, der Hintergrundprozess soll aber weiterlaufen und auf den nächsten Programmstart warten, wo dann wieder die gleiche Netzwerkverbindung verwendet wird.....usw.

z.B. auf der Konsole:
>java MeinProgramm startHintergrundProzess
Hintergrundprozess läuft
>java MeinProgramm send=Hallo
Hallo gesendet, MeinProgramm(Prozess) beendet
>java MeinProgramm send=Hallo2
Hallo2 gesendet, MeinProgramm(Prozess) beendet
>java MeinProgramm stopHintergrundProzess
Hintergrundprozess beendet

Also wie wird sowas ähnliches gemacht, verwendet man da Threads? Oder müssen das grundsätzlich 2 unterschiedliche Programme sein (Hintergrundprogramm und SendeProgramm) und wie können die dann untereinander kommunizieren?
Hoffe es ist alles halbwegs verständlich.


----------



## zerix (27. August 2007)

Hallo,

darf ich mal fragen was du machen möchtest?

MFG

zEriX


----------



## Gawayn (27. August 2007)

Bei dem, was du da beschreibst, handelt es sich um unterschiedliche Prozesse, weil es unterschiedliche Programme sind. Threads laufen *innerhalb* eines Prozesses, somit innerhalb desselben Programms. Deine Idee lässt sich mit sogenannter Interprozess-Kommunikation realisieren; da gibt es verschiedene Ansätze.

http://en.wikipedia.org/wiki/Interprocess_communication

-Gawayn


----------



## EdWood1 (27. August 2007)

Ok, also wenn ich dich jetzt richtige verstanden habe brauch ich 2 unabhängige Programme die mittels IPC mitteinander kommunizieren. Hab dazu schon die Stichwörter RMI und CORBA gefunden. Werd mir das mal anschaun.
Habe aber eher gehofft dass es etwas einfacheres gibt. Irgendwas wie ein Daemon-Thread der beim ersten Start aufgerufen wird. Wie gesagt, diesbezüglich bin ich noch blutiger Anfänger.

@zerix: ich will ein bestehendes Programm umschreiben. Im Moment schauts so aus dass jedesmal wenn ich z.b. ne Nachricht schicken will
>java meinProgramm send=test
das Programm ne Netzwerkverbindung aufbaut, die Nachricht schickt und die Verbindung wieder beendet.
Wenn ich jetzt mittels Script das Programm mehrmals aufrufe um mehrere Nachrichten hintereinander zu schicken, muss jedesmal die Verbindung neu aufgebaut/abgebaut werden. Wenn ich jetzt nur einmal am Anfang die Verbindung aufbau und am Ende, nach allen Nachrichten, die Verbindung wieder abbau, ist es natürlich besser.


----------



## Chris85 (27. August 2007)

Nein Du brauchst kein CORBA bzw. RMI bei deinem Vorhaben (oder willst Du einen entfernten Dienst implementieren?). Es sollten eigentlich ganz gewöhnliche Threads reichen, wenn ich es richtig verstanden habe. Der eine würde dann z.B. (von der Console) abfragen was du senden willst und der andere sendet es dann über den Socket. Guck Dir das Kapitel Threads beim openbook "Java ist auch eine Insel" an. Das kann man gut nachlesen. Ansonsten kannst Du Dir ja auch mal eine Implementierung von einem Echo-Dienst anschauen, da haste dann den entfernten Dienst dabei und es sollte eigentlich auch mit Threads implementiert sein...

Gruß


----------



## EdWood1 (29. August 2007)

ok, ich probiers mal anders: auf meinem Rechner will ich ein "Server"-Programm haben das ständig im Hintergrund rennt (also so was wie ne Art Daemon (?)). Der Server stellt die Funktionen zum Verbindungsaufbau/-abbau zu einem entfernten Rechner zur Verfügung. Beim Verbindungsaufbau wird ein eigenes session-Objekt erstellt und an das Client-Programm, das am gleichen Rechner läuft, übergeben. Der Client kann jetzt mit diesem session-Objekt Daten mit dem entfernten Rechner austauschen.

Soweit die Theorie, jetzt zur Frage: Muss ich dafür 2 einzelne Programme (Server+Client) schreiben die dann mittels IPC das session-Objekt austauschen oder geht das auch mit nur einem einzigen Programm mittels Threads (einen für den ständig laufenden Server und einen für den nur manchmal laufenden Client) ?

@chris85: wenn ich 2 programme am Rechner laufen hab (server+client) sind die ja in 2 verschiedenen JVM, deswegen bräucht ich zur Kommunikation z.b. RMI, d.h. wenn ich das richtig verstanden hab. Und was meinst du mit "von der Console abfragen"? Die einzige mögliche Benutzereingabe beim Client ist als Argument beim Clientaufruf, d.h. ich muss für jede Nachricht einen neuen Client starten, z.b.:
>java client text=hallo arg2=34
>java client text=hallo2 arg2=123
....


----------



## Ignus (29. August 2007)

Wieso 2 unterschiedliche Programme? Mach dir doch einfach nur eines, was beides kann und du dann überall starten kannst wie du lustig bist.
Ich habe zwar auch noch nicht sowas gemacht, würde es aber mit Sockets machen, um mich mit anderen Rechnern zu verbinden:

Das Programm sollte dann beim Starten:
- immer lauschen an einem Socket
- Daten über einen anderen Socket senden

Somit hast du nur ein Programm bei dem du keinen Server oder einen Deamon benötigen würdest.
Sowas steht bei mir auch noch auf der Todo-liste ^^


----------



## Gawayn (29. August 2007)

Wieso wird hier ständig versucht, EdWood von seinem Vorhaben abzubringen? Das, was er vorhat, ist nichts Exotisches und eine gängige Vorgehensweise. In manchen Fällen gibt es sogar keine Alternative. Also soll er doch ruhig einen Server schreiben, wozu die Kritik?

-Gawayn


----------



## zerix (30. August 2007)

@Gawayn
Ich kann hier keine Kritik erkennen. Hier versucht auch keiner ihm sein Vorhaben auszureden. Ich sehe hier nur Vorschläge, wie er es lösen könnte.

Meine erste Idee wäre auch RMI oder Sockets, wobei RMI die leichtere Variante wäre.

MFG

zEriX


----------

