# Sockets, readLine()



## Exavier (5. Mai 2007)

Hallo liebes Forum, 

wir müssen für die Uni einen Mail-Client schreiben, der vorerst nur abrufen soll. Und zwar eine beliebige Mail von einem beliebigen Account.

Ich habe neben main prozedur noch diveres andere für anmelden, abholen, löschen, statusabfrage und schliessen etc... das heisst, dass ich nach der Anmeldung die Sockets erstmal nicht schliesse und der User entscheiden kann wie er weitermachen möchte.

Mein Problem besteht darin, dass ich in der Anmeldung folgen Code-Schnipsel nicht verwenden kann:


```
while ((responseLine = inputstream.readLine()) != null) {
          System.out.println("Server: "+responseLine);
          System.out.println(responseLine.startsWith("+OK"));
          if (responseLine.startsWith("+OK")){
            korrekt=true;
          }
          if (responseLine.indexOf("222") != -1) {
            break;
          }
        }
```

Da ich ja von dem Server-Buffer laufend Lesen möchte, solang ich noch etwas bekomme. Nur wartet die Methode readLine() leider so lang, bis vom Server nen Zeilenumbruch kommt. Da ich haber nichts mehr sende kommt auch nichts mehr, und da hört das progrämmchen auch schon auf zu arbeiten.
Wie kann ich es ohne nen Timeout lösen, dass er nachdem ich vom Buffer alles gelesen habe was da ist das Programm einfach weitermacht?

Timeout aus dem Grund nicht, da es pro Verbindung und Rechner zu untrerschiedliche Zeiten sein können.

mfg

exa

PS: habs in keinem anderen forum geschrieben.


----------



## Tellerrand (5. Mai 2007)

Ich verstehe das Problem nicht ganz.
Du verwendest keinen Thread der auf dem Socket auf ankommende Daten wartet sondern hällst quasi das Programm an bis Daten angekommen sind?


----------



## Guest (5. Mai 2007)

ich möchte die daten, die der server im buffer hat für jede prozedur einzeln auswerten... in dem fall konkret wäre das 

ok für verbidung
ok vaild username
ok passwort accepted
..
und die möchte ich alle auslesen, verarbeiten und ggf. ausgeben...und das mache ich mit readLine(), aber der Server sagt mir nicht: so.. jetzt is mein buffer leer.. du kannst mir was neues senden....

und deshalb wartet readLine() bis ich was neues empfange vom server.. aber das ist ja nichts mehr.. weil ich in der prozedur die verbindung nicht abbaue 

kann man readLine() irgendwie umbauen.. oder gibt es ein äquivalent, das nicht wartet, bis vom server was kommt?


----------



## Guest (5. Mai 2007)

ich poste mal mehr von der prozedur


```
if (popSocket != null && outputstream != null && inputstream != null) {
      try {
        outputstream.writeBytes("USER "+account+"\n");
        outputstream.writeBytes("PASS "+password+"\n");
        String responseLine;
        while ((responseLine = inputstream.readLine()) != null) {
          System.out.println("Server: "+responseLine);
          System.out.println(responseLine.startsWith("+OK"));
          if (responseLine.startsWith("+OK")){
            korrekt=true;
          }
          if (responseLine.indexOf("222") != -1) {
            break;
          }
        }
      }catch (UnknownHostException e) {
        System.err.println("Unknown Host: "+e);
        korrekt = false;
      }catch (IOException e) {
        System.err.println("IOException:  " + e);
        korrekt = false;
      }
    }
```

Ich initialisiere also popsocket und die beiden streams, schicke dem server die Daten für den login und wenn das alles getan ist und die prozedur aufhören soll horcht readLine() weiterhin. Es fehlt also eine geeignetet abbruchbedinung oder sowas dergleichen. denn der server sagt ja nichts mehr nachdem er die erstens oks gesendet hat

hoffe das trägt zum verständnis bei[/quote]


----------



## Exavier (5. Mai 2007)

habe oben vergessen Username anzugeben.. sorry..

nochmal kurz: mein problem ist mir bewusst. readLine() horcht so lang bis was kommt,.. und wenn 10 min nix kommt dann horcht er eben 10 min... ich suche also eine elegante lösung.

ansatz 1: wenn ich mit sicherheit weiss, dass jeder mailserver für socket aufmachen + accounteingabe + passworteingabe 3 antworten auf seinen buffer legt, brauch ich nur bis 3 zählen und kann aufhören. 

ansatz 2: ich setze nen timeout auf x sekunden, und wenn bis dahin nix passiert kommt nen break. 

ansatz 2 find ich seeehr unschön. ansatz 1 ist ok, sofern die 3 garantiert werden..

andere lösungen? meinungen?

exa


----------



## Tellerrand (5. Mai 2007)

Laut pop3 RFC ist es garantiert das 3 Meldungen kommen.
1. Verbindungsaufbau
2. Antwort auf Username
3. Antwort auf Passwort

... sofern ich mich da nun nicht ganz verhaspelt habe.

EDIT: Ähm, ich habe natürlich ncihts darüber gesagt was passiert wenn da was nicht stimmt mit Username PAsswort und Verbindungsaufbau.
Notfalls musst du dich da selber mit den Protokollen befassen


----------



## Exavier (5. Mai 2007)

vielen dank... dann werd ich mal lesen


----------



## mic_checker (7. Mai 2007)

Versteh problem auch nicht ganz. Hatten ähnliche aufgabe. Hab erst Verbindung aufgebaut, dann USER rübergeschickt und dann PASS. Jeweils kontrolliert ob laut Rückgabe alles ok ist und dann kannst du LIST, RETR etc. ganz normal aufrufen.


----------

