ChatApplikation - Listen

Status
Nicht offen für weitere Antworten.

alipkp

Mitglied
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:

Code:
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

Mitglied
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

Top Contributor
Ein Fehler den ich auf Anhieb sehe: Du kannst in einem void keine Werte zurückgeben:
Code:
public void listen()
  { 
    //...
            //try{
            //    return einNet.readLine();
    //,,,
Dazu musst du den Typ der Methode auf String ändern:
Code:
public String listen()
  { 
    //...
 

alipkp

Mitglied
@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:
Code:
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

Top Contributor
Mach' mal hinter das
Code:
s = ionet.empfangen()
ein Thread.sleep von einer Millisekunde oder so. Dann hat er etwas "Bedenkzeit" nach jedem Aufruf.
 

alipkp

Mitglied
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?
 
J

JensRa (nicht eingeloogt)

Gast
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

Mitglied
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?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Netzwerkverzeichnise listen Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben