# Frage zur Socketprogrammierung



## questionmark (10. Sep 2012)

Hallöchen 
hab eine kleine frage, auf die ich keine antwort finde.
ich benötige ein programm, das unterteilt ist in Klient und server.
ich kenne das so:
der server hat einen serversocket
der klient einen socket

nun hab ich beide erzeugt, aber der serversocket muss zuerst starten, da der socket vom klienten sonst meckert weil er kein I/O hat, und er schließt sich.
meine klienten sollen aber das programm immer laufen haben und erst reagieren wenn ein serversocket eröffnet wird.
da ich viele klienten habe wäre das ja quatsch den klienten den serversocket zu geben, der kann ja dann immer laufen.

versteht ihr was ich meine?


----------



## FArt (10. Sep 2012)

Die Frage war: versteht ihr was ich meine? Die Antwort ist: so ungefähr. Das hilft dir aber wohl noch nicht.

Überlege doch, ob nicht ein Webserver oder ein Applicationserver benötigt wird.

Für kleinere Sachen reicht auch Spring (mit Spring Remoting) oder eine andere Remoting API (Apache Mina, JBoss Remoting, Netty). Natürlich kann man auch vieles selber machen: RMI oder SIMON, oder Hardcore: Sockets.


----------



## SlaterB (10. Sep 2012)

welche Richtungen kommen denn ungefähr in Frage,
die Clients laufen schon bevor der Server da ist, schön und gut, aber was soll denn ungefähr passieren bei neuem Server,
soll der alle Clients aktiv ansprechen? oder diese periodisch nachschauen ob Server inzwischen da?


----------



## Gasd (12. Sep 2012)

das wäre eigentlich egal wie die server-client-verbindung geprüft wird
gefunden habe ich noch diesen thread (is der runnable  )

http://www.java-forum.org/netzwerkp...r-server-client-chat-weiteren-funktionen.html

ist diese methode zu empfehlen? in einer schleife mehrere ports abzulaufen und zu warten bis ein port bindet? oder bessere methoden dafür?

p.s. ich komme nicht ins postfach...und passwort-vergessen geht leider auch nicht
kann ein admin meine email-adresse ändern?

questionmark


----------



## Morphastian (12. Sep 2012)

Frage: Was für einen Sinn soll es haben, wenn du mehrere Clienten hast, die aber im Endeffekt nichts machen können? Wäre nett wenn du dein Problem mal genauer beschreiben könntest.


----------



## Gasd (12. Sep 2012)

danke für deine antwort,
was die clienten dann machen ist ja egal
mein problem ist nur:

das client-programm soll mit windows starten(im autorun ordner) und so lange horchen, bis sich der server verbindet,
und dann BEISPIELSWEISE eine methode "sayHello()" ausführen.
aber wie Horche ich nach dem server? bis er startet eben.
eine lösung ist in dem thread den ich gelinkt hab, aber das schaut so..."unkonventionell" aus


----------



## Morphastian (12. Sep 2012)

Also erstmal ist diese Antwort ohne Gewähr.

Du könntest etwas in der Art versuchen:

```
private boolean bla;

try {
Socket socket = new Socket("IP", 1338);

while (bla == false) {
DataInputStream dataIn = new DataInputStream(socket.getInputStream());
DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());

//Lass den Clienten was machen :D

}catch (UnknownHostException e) {
e.printStrackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
```

Somit würde quasi die ganze zeit gehorcht werden. Den Server lässt du beim Start dann einfach was schreiben, was der Client verarbeitet und "bla" true setzt. Bsp 

```
dataOut.writeUTF("Anwesend");
```

Dies könntest du dann im Client widerrum mit 

```
String Status = dataIn.readUTF();

if (Status.contains("Anwesend") {
bla = true;
}
```
verarbeiten. 

Ich hoffe, das hilft, ist mir gerade eben eingefallen


----------



## Gasd (12. Sep 2012)

saugeil  das klingt gut so können auch gleich weitere funktionen abgfragt werden wie "mac21" (link) das macht

wenn ich seinen/ihren post verstanden habe fahren die clienten dann gleich herunter.
antworte ihm doch mal im thead 
multithreadfaehiger-server-client-chat-weiteren-funktionen.html


----------



## Michael... (12. Sep 2012)

Morphastian hat gesagt.:


> Somit würde quasi die ganze zeit gehorcht werden.


Wo würde da die ganze Zeit gehorcht werden?
Wenn unter der IP auf dem Port nichst ist, das eine Socketverbindung annimmt, dann wird garnichts gehört. Die Verbindung kommt ja nicht zu stande.


----------



## Gasd (13. Sep 2012)

doch...mit einer abfrage
an ip horchen
bei conncection: weiter
bei keiner conection: von vorne


----------



## Michael... (13. Sep 2012)

Klar kann man in einer Schleife solange versuchen eine Verbindung aufzubauen bis eine zustande kommt. Aber "horchen" kann man da nirgends. Im oben geposteten (Pseudo) Code wurde ja nur einmal versucht in ein Verbindung aufzubauen. Beim erfolgreichem Verbindungsaufbau macht die anschließende Schleife keinen Sinn, bei Fehlschlag wird die Schleife (abgesehen, dass sie auch hier keinen Sinn macht) nicht erreicht, da eine Exception fliegt.


----------



## mac21 (13. Sep 2012)

anscheinend hast du ein ähnliches problem?

aber ich dachte auch, dass horchen bedeutet dass auf die accept() des servers gewartet wird?


----------



## Michael... (13. Sep 2012)

mac21 hat gesagt.:


> aber ich dachte auch, dass horchen bedeutet dass auf die accept() des servers gewartet wird?


Wenn damit "warten" auf den erfolgreichen Verbindungsaufbau gemeint ist, ist das ja OK. Aber davon konnte ich hier bisher nirgends was finden.


----------

