# Empfangen von Strings



## H3llGhost (7. Mai 2008)

Hallo Leute,

ich habe folgenden Code:

```
public void send(String message) {
    try {
      out.writeUTF(message);
    }
    catch(IOException e) {
      e.printStackTrace();
    }
  }
```

Wie kann ich das von einem Client mit dem InputStream sichtbar machen?
Ich habe mir überlegt das ich das mit folgendem Code machen kann:


```
private ArrayList<String> inpt;
    String tmp = "";
    inpt.clear();
    try
    {
     while (!((tmp = in.readUTF()) != null)) //(!(tmp = in.readLine()).equalsIgnoreCase("</antwort>"))
     {
      inpt.add(tmp);
      System.out.println(tmp);
     }
    } catch (Exception e)
    {
     System.out.println(e);
     System.out.println(inpt);
    }
```

Mein Problem ist jedoch, dass der Client scheinbar nichts empfängt.
Vielleicht ist da auch ein Fehler in der while-Schleife ...

Ich bitte um einen Tipp von eurer Seite!
Danke im Voraus!


----------



## SlaterB (7. Mai 2008)

der Sender sendet vielleicht erst nach einem
flush();
Aufruf

die doppelte Negation in der while-Schleife ist aber auch schlecht, stimmt


----------



## H3llGhost (7. Mai 2008)

Reicht flush() schon oder sollte mal ein out.flush() nutzen?


----------



## SlaterB (7. Mai 2008)

nene, repariere doch erst lieber mal dein while,
prüfe mal mit 

while (!((tmp = "Hi") != null)) 

ob das läuft


----------



## H3llGhost (7. Mai 2008)

Habe die nun zu

```
while((text = in.readUTF()) != null)
```
angepasst und nun geht es ... 
Danke für deinen Tipp ...
Leider funktioniert das noch nicht so ganz mit dem Senden und Empfangen ...


----------



## The_S (7. Mai 2008)

out.flush aufrufen.


----------



## H3llGhost (7. Mai 2008)

Hmm ...
Danke jetzt scheint es zu gehen ...
Ich werde es nun mal andersrum probieren ... 

EDIT:

So mein Problem war ja folgendes noch:
Der Client soll solange auf horchen gehen bis der String mit </antwort> endet.
Oder wie würdet ihr das am Besten realiseren, dass der Client auf den Server horcht?
Mit einem einzelnen Thread dafür?


----------



## The_S (7. Mai 2008)

```
while(!"</antwort>".equals(text = in.readUTF())) {
}
```

!?


----------



## H3llGhost (8. Mai 2008)

Hmm ...
Funktioniert leider nicht ...
Geht das überhaupt?
Also von der Theorie?


----------



## SlaterB (8. Mai 2008)

denk doch mal bitte eine Sekunde nach..
du empfängst vom Server Strings, ok,
darin wird schon </antwort> drinstehen, ok

warum sollte man nun nicht darauf testen können, selbstverständlich geht sowas,
die Frage 'Geht das überhaupt?' macht überhaupt keinen Sinn, verärgert mich 

----------

natürlich kann es gut sein, dass Hobbits Code nicht deine Aufgabe erfüllt, z.B. wenn </antwort> nicht eine eigene Zeile ist,
was liest überhaupt readUTF(), immer eine Zeile? zu welchem Reader gehört das?

fang doch erstmal ganz klein an, und lies die Strings ein und gib sie mit System.out.println() aus, dann siehst du ja was ankommt,

wenn  </antwort> in einem größeren String mit drinsteckt, dann musst du mit contains() prüfen


----------



## H3llGhost (8. Mai 2008)

Es kommt ja nichts an ...
Das ist es ja ...
Und er geht sofort aus der While-Schleife raus obwohl kein </antwort> ankommt ...


----------



## SlaterB (8. Mai 2008)

> Es kommt ja nichts an ... 

aha, es kommt nichts vom Server an und du überlegst, wie du </antwort> daraus lesen kannst?
sehr sinnig

aber ich gebe nun auf bei solchen einsilbigen '...'-Antworten ohne Code, genaue Beschreibung,
Hobbit, übernimm wieder


----------



## H3llGhost (9. Mai 2008)

Ich werde mal den ganzen Code posten und von euch mir garantiert anhören können, dass das wohl Müll ist ... xD
Also das ist mein Server:

EDIT²:
Code entfernt auf Grund der Länge ...
/EDIT²

Ich hoffe SlaterB das gefällt dir ein bisschen mehr ... 

In der Klasse Draw ist eine Methode receive() und diese empfängt leider nichts ...
Ich bekomme da eine NullPointerExecption und die ArrayList ist leer.
Sprich er empfängt nichts, was wie zu sehen ist ich mit einem System.out.println() mache.

Wie ich gerade genauer überprüft habe kommt die NullPointerException bei dem Code: while(!"</antwort>".equals(tmp = in.readUTF())).
Ich habe das gerade dann als einzelne Zeile geschrieben, also das tmp = in.readUTF() und da kommt derselbe Fehler.
Ich würde sagen dann muss in meinem Programm was mit dem DataInputStream nicht stimmen oder was meint ihr?

EDIT:
Und genau daran lag es ... 
Ich habe in dem Konstruktor der Klasse ppDraw den Übergabeparameter als in2 benannt, er musste aber in heißen.
/EDIT

Desweiteren würde ich das mit dem Server gerne so Regeln wie bei einem Chatserver, als ein Client sendet die Koordinaten des Schlägers und der Server soll das dann an alle Clients senden.
Genauso wie die Koordinaten des Balles.
In meiner alten Version mit dem BufferedReader und PrintWriter hat es extrem geruckelt aus diesem Grund bin ich umgestiegen, da man nun auch synchronized benutzen kann ... (vielleicht konnte man es auch vorher schon benutzen wusste ich dann aber nicht).


----------



## SlaterB (10. Mai 2008)

man kann es auch in die andere Richtung übertreiben

> Ich habe in dem Konstruktor der Klasse ppDraw den Übergabeparameter als in2 benannt, er musste aber in heißen. 

na das klingt ja nach wichtigen Problemen, 
so ins Detail und 600 Zeilen Code möchte ich persönlich auch wieder nicht

wenn es noch um das urspüngliche Sende/ Empfangen geht, dann bitte in zwei kleinen Testprogrammen zu je 50-100 Zeilen, ohne GUI oder sonstige Nebensächlichkeiten,

klar macht das Arbeit, aber dabei legt man die wichtigen Programmstellen frei und findet manche Fehler schon so


----------



## H3llGhost (14. Mai 2008)

Entschuldigung ...
Ich wollte ehrlich gesagt auf Codeschnipsel verzichten, damit es einfacher wird alles zu verstehen.
Aber danke für den Tipp ich werde mich beim nächsten Mal dran halten ...


----------

