# Problem mit Client-Server Kommunikation



## Guest (7. Nov 2007)

Hallo allerseits,

ich hab ein problem mit der Client Server Kommunikation. 


folgendes funktioniert:

```
private void startConnection()
{
    Socket LokalerSocket = null;
    try 
    { 
      LokalerSocket = new Socket("Adresse", "port");
      GlobalerSocket = LokalerSocket;
      
      startWriting("Das ist die Nachricht");
    } 
    catch ( Exception e ) 
    { 
     e.printStackTrace();
    } 
    finally 
    { 
      if ( GlobalerSocket != null ) 
      {
        try 
        { 
          GlobalerSocket.close();  
        }
        catch ( Exception e ) 
        { 
          e.printStackTrace();
        } 
      }
    }
}

private void startWriting(String Message)
{
   try
   {
     PrintStream PS = new PrintStream(GlobalerSocket.getOutputStream(), true); 
     PS.print(Message);
     PS.flush();
   }
   catch (Exception e)
   {
     e.printStackTrace();
   }
}
```

Wenn ich nun das finally, in dem der Socket geschlossen wird, weglasse, bekommt der Server die Nachricht nicht.

Ich möchte nämlich die Methode startWriting (und startReading) jeweils als eigenen Thread aurufen, die aber dann natürlich nicht arbeiten können da der Socket vorher geschlossen wird.

Für lösungsvorschläge wäre ich dankbar.


MfG


----------



## Dandro (7. Nov 2007)

Nabend 

Als erstes glaube ich nicht, dass mir die Absicht dahinter wirklich klar geworden, was du willst? ^^
Trotzdem möchte ich mal betonen, dass es durchaus Sinn macht, dass du den Socket in einem Try-Finally Block schließt. Zu dem Fehler dann kann ich nur sagen, dass der Socket bei einem close() nocheinmal alles abschickt, was bei ihm zum senden vorliegt. Vielleicht solltest du es nochmal mit einem expliziten "flush()" des Outputstreams des Sockets versuchen?

Ansonsten frage ich mich ernsthaft, ob der "PrintStream" hier wirklich der geeignetste ist. Dachte der wäre dafür da in Verbindung mit Druckfunktionalitäten benutzt zu werden?


----------



## Gast (7. Nov 2007)

Du hast recht, die Daten werden erst geschickt wenn der Socket geclosed (ich liebe verdenglischung) wird. Auf der Anderen Seite wartete nämlich ein BufferedReader auf \n. Ich benutz jetzt ein BufferedWriter der an die Nachricht einfach ein \n hinten anhängt, und der Socket wird mit einem timeout im finally block geclosed...

wenn jemand die Lösung sehen will.. sagen


MfG


----------



## Dandro (7. Nov 2007)

Der wartet auf ein "New Line"? 
Das ist schon bestimmt 3 Monate her, dass ich mal ne größere Serveranwendung geschrieben habe, aber damals habe ich das soweit ich weiß (Bin gerade nicht daheim) mit einem BufferedInputStream bzw. BufferedOutputStream geregelt.

Das war erstens schnell, und ich konnte prima von der Klasse ableiten um einen InputStream zu schreiben, der mir die Daten Paketweiße lieferte


----------



## Gast (7. Nov 2007)

Die sind denk ich mal ziemlich gleich, kenn den unterschied jetzt nicht genau, aber man kann genau so einfach ein getInput bzw. get Output- Stream ableiten

BufferedReader BR = new BufferedReader(new InputStreamReader( GlobalerSocket.getInputStream()) );


----------

