# TCP Client socket



## ryane (17. Sep 2010)

Hallo leute , 
Ich bin neue in Java und bastele grade an einem GUI , was eine server verbindung herstellen soll und daten empfangen.
Ich habe im Netz viele implementierungen gesehen aber damit konnte ich mein Problem bis jetzt nicht lösen. Ich erkläre euch  mein vorhaben :
Mein Client ist ein GUI , er soll nachhrichten in 1000ms abstände zum server schicken. er bekommt die Antworten und muss jede antwort separat lesen und in ein dafür gesehenes jTable einfügen. 
Danach soll das protocol weiter laufen und gegebensfalls die Tables mit neuen werte aktualisieren.

kann mir bitte jemand über das vorgehen helfen ? 
ich habe es versuch es funktioniert nicht wirklich.

Danke im vorraus


----------



## Atze (17. Sep 2010)

wie sieht denn dein versuch aus? was funktioniert denn nicht?


----------



## ryane (17. Sep 2010)

Danke für deine Antwort.
Ich kann bis jetzt nur eine Nachricht senden , empfangen und in sein Table einfügen. Ich kriege es nicht hin andere hinterher abzuschicken und die entspechende Antworten einzulesen. Was muss ich für diese Koordination machen ?
Wie schicke ich Nachrichten in 100ms Abstände und wie kann ich sicherstellen , dass ich genau die dazugehörige Antwort einlese ? 
gibt es auch einen trick um zu überprüfen, ob daten zum einlesen verfügbar sind ?

das Abschicken muss natürlich auch gestoppt werden sobald ich die verbindung unterbreche.
Danke!


----------



## Kaffeebohn (17. Sep 2010)

Wahrscheinlich wirst du an Threads nicht vorbeikommen.

Ein Thread übernimmt z.B. das Senden von Daten, dabei kannst du den Thread mit Thread.sleep(1000) immer eine Sekunde lang schlafen legen bevor er ein neues Paket versendet. Den Stream schließt du dabei einfach nicht, sonst bricht die Verbindung ab.

Wenn du einen Stream einliest, dann wartet die Methode ja für gewöhnlich immer solange, bis neue Nachrichten kommen. Du verarbeitest dann also immer die gerade einkommenden Nachrichten, ansonsten verbringst du die Zeit mit warten (Methode blockiert).


Sobald du die Verbindung unterbrichst werden auch alle offenen Streams bzw. deren Sockets geschlossen.

Hilft dir das?

Grüße


----------



## Kr0e (17. Sep 2010)

Zeige uns Code... Pauschalantworten von uns sind für dich nicht hilfreich.

Z.B: "[...] gibt es auch einen trick um zu überprüfen, ob daten zum einlesen verfügbar sind ?"
Antwort: Ja.

Hilft dir aber nicht weiter. Außerdem hört es sich so, als wenn du keinen separaten Thread fürs Lesen vom Socket nutzt.
Also einfach mal den relevanten Code hier posten und wir können dir sicherlich im Handumdrehen helfen 

Gruß,

Chris


----------



## ryane (17. Sep 2010)

> gibt es auch einen trick um zu überprüfen, ob daten zum einlesen verfügbar sind ?


ich habe mit dem folgenden code geprüft :
public boolean DataAvailable() {
    return in!=null;  // wobei  "in" mein inputStream is
}




> was der Thread angeht habe den folgenden code geschrieben , leider lauf er nicht die ganze zeit sondern nur ein mal





```
public void sendCommand(final String command)
   {
      Thread  sendThread = new Thread ( new Runnable() {@Override
         public void run() {
               try {
            out = socket.getOutputStream();
            PrintWriter outStream = new PrintWriter(out,true);
            outStream.println(command+end);
            outStream.flush();
           sendCommand("hallo");
            } catch (IOException ex) {
            state_label.setText("State: send Message failed!!!" +ex.getCause());
           }
                try {
                    Thread.sleep(100);
                    
                } catch (InterruptedException ex) {
                    Logger.getLogger(Profiler1.class.getName()).log(Level.SEVERE, null, ex);
                }
               readMsg(); // hier lese ich wieder den input stream
     }});
  }
```
 
soll ich auch die readMsg()  in einem Thread einbauen ?


----------



## Kaffeebohn (17. Sep 2010)

Hiho,

also erst mal zum Lesen. Ich weiß ja nicht was du für einen Reader benutzt, aber z.B. bei einem BufferedReader liest man Zeilen ja so:


```
String incoming = reader.readLine();
```

Diese Methode blockiert so lange, bis eine Zeile kommt, diese wird dann gelesen und kann weiterverarbeitet werden. Du musst also z.B. eine while(true) {} Schleife drumrumbauen die immer wieder an dieser Methode stehen bleibt um auf neuen Input zu warten. Das muss in einem extra Thread geschehen damit deine ganze Anwendung nicht hängt.


//EDIT

Wenn ich dich richtig verstanden habe, dann sieht dein "Protokoll" ja vor, dass deine Anwendung etwas an den Server sendet, die Antwort abwartet und dann nach 1000 ms wieder etwas sendet.
Dann könntest du grundsätzlich der Einfach heit halber das ganze so ablaufen lassen (im extra Thread):


```
out = socket.getOutputStream();
PrintWriter outStream = new PrintWriter(out,true);


while(true) {

outStream.println(command+end);
outStream.flush();

// HIER DIE ANTWORT EINLESEN UND VERARBEITEN



}
```


----------



## Kr0e (17. Sep 2010)

An dem Code stimmt was nicht!
Dein Thread da drinnen wird NIE gestartet! Du musst sendThread.start() aufrufen.
ABER: Bei deinem Code würde dann sowieso eine Endlosschleife entstehen:


```
public void sendCommand(final String command)
   {
      Thread  sendThread = new Thread ( new Runnable() {@Override
         public void run() {
               try {
            out = socket.getOutputStream();
            PrintWriter outStream = new PrintWriter(out,true);
            outStream.println(command+end);
            outStream.flush();
           sendCommand("hallo"); //Macht das nicht ne Dauerschleife ? Du öffnest doch quasi nach einem Aufruf von sendCommand immer wieder SendCommand...
            } catch (IOException ex) {
            state_label.setText("State: send Message failed!!!" +ex.getCause());
           }
                try {
                    Thread.sleep(100);
                    
                } catch (InterruptedException ex) {
                    Logger.getLogger(Profiler1.class.getName()).log(Level.SEVERE, null, ex);
                }
               readMsg(); // hier lese ich wieder den input stream
     }});
  }
```


----------



## ryane (17. Sep 2010)

Danke jungs ! 
Jetzt funktioniert !!! ich habe die anweisungen von *kaffebohn* gefolgt
hat noch zwar ein paar Macken , aber die werde ich selber lösen... hoffe ich 

noch mal vielen dank !!


----------

