# ChatApplikation - Listen



## alipkp (18. Mrz 2007)

Hallo,

Ich schreibe (bzw. versuche es ;-) ) gerade einen kleinen Java-Chat und hänge bei den "Listen-Methoden" des Server sowie des Clients fest. Hier des Code des Clients:


```
public void listen()
  {

           String s = ionet.empfangen();
    
            // ionet ist das Object der InOutNet-Klasse, die eine Verbindung handhabt. Hier ihre Methode 'empfangen':
            //try{
            //    return einNet.readLine(); //einNet ist der BufferedReader, der den InputStream des Sockets ließt
           // }catch(IOException e){
           // System.out.println("Lesefehler");
           // return null;
           //  }
            
            while(!s.equals("quit")) 
            {
                processMessage(s); //in eigene TextArea schreiben
                s = ionet.empfangen(); //Auf Antwort des Servers warten

            }
  }
```

Beim ausführen der Listen Methode entsteht eine Endlosschleife. Warum wartet er denn nicht auf die Antwort und blockiert die Schleife? Bin für jede Hilfe danbar! 

Gruß
Alex


----------



## jensra (18. Mrz 2007)

Hallo,

etwas mehr Code wäre hilfreich...

Habe für die Clientseite eine JAVA-Schnittstelle geschrieben, die alles dann an JavaScript übergibt.
(Terminator \0 statt \n +Start-Ende-Terminator, um kaputte Übergaben nicht zu verarbeiten.)

Als Thread-Denkanstoß - Vielleicht hilfreich:
(Dort warte ich zwar noch auf Antwort, aber der Code läuft so einwandfrei, wenn man auf dem gleichen Server bleibt.)
www.java-forum.org/de/topic46089_java-applet-socketzugriff-auf-anderen-server.html


----------



## dieta (18. Mrz 2007)

Ein Fehler den ich auf Anhieb sehe: Du kannst in einem void keine Werte zurückgeben:

```
public void listen()
  { 
    //...
            //try{
            //    return einNet.readLine();
    //,,,
```
Dazu musst du den Typ der Methode auf String ändern:

```
public String listen()
  { 
    //...
```


----------



## alipkp (18. Mrz 2007)

@dieta: Der Code ist ja auch wegkommentiert  War nur zur Erklärung gedacht. Es geht mir nur um ein theoretisches Verständnis. Der Chat sollte nie zum richtigen Einsatz kommen...Hier die Klasse InOutNet:

```
import java.io.*;
import java.net.*;

public class InOutNet
{

    private Socket verbindung;
    private BufferedReader einNet;
    private PrintWriter ausNet;
    private boolean connected = false;
    
    /** Verbindung Client -> Server */
    public InOutNet(String servername, int port)
    {
         
        try{
            verbindung = new Socket(servername, port);
            einNet = new BufferedReader(new InputStreamReader(verbindung.getInputStream()));
            ausNet = new PrintWriter(new OutputStreamWriter(verbindung.getOutputStream()),true);
            connected = true;
           
        }catch(IOException io){
            System.out.println("Verbindungsfehler");
        }
    }
    
    /** Verbindung Server -> Client */
    public InOutNet(Socket s)
    {
      try{
            verbindung = s;
            einNet = new BufferedReader(new InputStreamReader(verbindung.getInputStream()));
            ausNet = new PrintWriter(new OutputStreamWriter(verbindung.getOutputStream()),true);
            connected = true;
        }catch(IOException io){
            System.out.println("Verbindungsfehler");
        }
    }
    
    public boolean isConnected()
    {
       return connected;
    }
    
    public String empfangen()
    {
        try{
            return einNet.readLine();
        }catch(IOException e){
            System.out.println("Lesefehler");
            return null;
        }
    }
    
    
   
    public void senden(String s)
    {
        ausNet.println(s);   
    }
    
    public void ende()
    {
        ausNet.close();
        
        try{
            einNet.close();
            verbindung.close();
        }catch(IOException io){
            System.out.println("Schließfehler");
        }
        
    }
}
```


----------



## dieta (18. Mrz 2007)

Mach' mal hinter das

```
s = ionet.empfangen()
```
ein Thread.sleep von einer Millisekunde oder so. Dann hat er etwas "Bedenkzeit" nach jedem Aufruf.


----------



## alipkp (18. Mrz 2007)

Ich dachte immer das Besondere wäre, dass die readLine()-Methode eine blockierende Methode ist, also die Schleife stoppt bis ein InputStream des Sockets empfangen werden kann. ???:L 

Oder sollte der Thread zum Finden des Problems implementiert werden?


----------



## JensRa (nicht eingeloogt) (18. Mrz 2007)

readline sollte blockierend sein. nutze es selbst nicht. (bei read bin ich mir 100 % sicher, das es blockiert, deshalb der link.)

ist auch sicher nicht das dateiende \n erreicht? ... dann geht readline() sofort weiter...
String r=einNet.readLine();

//debug
länge von r ausgeben;

return r;

MfG


----------



## alipkp (19. Mrz 2007)

Hmm, an der ReadLine Methode scheint es nicht zu liegen...Ich habe jedoch die Vermutung, dass der Client nicht wegen einer Endlosschleife, sondern wegen des Wartens auf eine Antwort vom Server, hängt. 

Kann es sein, dass die Listen-Methode nicht in dieselbe Klasse kommen darf, in der die AWT/Swing Oberfläche läuft?


----------

