Kay: SocketConnection in J2ME

Hallo,

ich habe einige Schwierigkeiten, eine TCP-Verbindung in J2ME herzustellen.
Die Anwendung (ein MIDlet) soll eine Verbindung zu einem beliebigen Mailserver herstellen.
Es wird keine Exception geworfen - es ist, als ob sich die Anwendung in einer Endlosschleife befindet (blockiert).

Wo könnte der Fehler im folgenden Code liegen?

public void commandAction(Command command, Displayable displayable) {
  if (command == cmdVerbinden) {
    String received = "Keine Daten.";
    try {
      SocketConnection sc = (SocketConnection)Connector.open("socket://mail.gmx.net:25");
      InputStream reader = sc.openInputStream();
      byte[] data = new byte[1024];
      int bytesRead;
      do {
        bytesRead = reader.read(data, 0, data.length);
        if (bytesRead > 0) received += new String(data, 0, bytesRead);
      } while (bytesRead > 0);
      reader.close();
      sc.close();
    } catch (IOException ioe) {
      text.setString("IOException:\n" + ioe.getMessage());
    }
    text.setString(received);
  }
}

Vielen Dank und viele Grüße,
Kay

  1. Hallo,

    ich habe zwar mit der J2ME nichts gemacht, aber ich kann in dem Quelltext auch keinen richtigen Sinn erkennen. Du scheinst eine TCP-Verbindung zu einem Mailserver aufzubauen, welcher per SMTP mit dir kommunizieren will. Dann hörst du dem Mailserver so lange zu (und er hat nicht viel zu sagen), bis er sich veräppelt fühlt und die Verbindung schließt (connection timeout). Dann ist bytesRead == 0 und das Programm beendet sich ohne exception. Ich glaube, das Problem ist hier nicht der Aufbau der TCP-Verbindung sondern schlichtergreifend die wechselseitige Kommunikation.

    Lies am besten nach, wie SMTP funktioniert. Da es zeilenbasiert ist, musst du auch zeilenweise aus dem Stream lesen können. Hier bietet es sich an, wie folgt vorzugehen:

    BufferedReader br = new BufferedReader(new InputStreamReader(sc.openInputStream()));
    while (weitere_zeile_erwartet)
    {
      nächste_zeile = br.readLine();
    }

    Du wirst dann sehen, dass der Server nach Senden eines kurzen Begrüßungstextes ("220 mail.gmx.net GMX Mailservices ESMTP {mp002}") nach Befehlen auf dich wartet.

    Viel Erfolg,
      Johannes Röckert

    1. Hallo,

      vielen Dank erstmal für deine Antwort.
      Wie SMTP funktioniert, weiß ich auch. Es geht hier auch nicht darum, eine komplette SMTP-Sitzung durchzuführen. Der gepostete Code soll auch lediglich den Aufbau der Verbindung demonstrieren und nur den Begrüßungstext lesen. Dass du in dem Code dann keinen Sinn siehst, ist ja logisch.
      Dass man zeilenweise aus der Socketverbindung lesen kann, ist mir ebenfalls klar. BufferedReader gibt's aber in J2ME nicht. Deshalb kann man halt nur blockweise lesen...

      Das Problem muss irgendwo anders liegen.

      Viele Grüße,
      Kay