Socket InputStream sendet ausgaben von OutputStream zurück

*Merc

Mitglied
Moin !
Ich muss für die Uni einen pop3 sammeldienst mit Server Funktion schreiben und dazu das POP3 Protokoll implementieren.
Das klappt bisher auch alles gut und ich bin fast fertig nur jetzt scheitere ich an einem irgendwie blöden Fehler.....

Ich benutze zum Senden an den Client einen BufferedWriter und zum Empfangen einen BufferedReader, die streams hole ich mir jeweils vom socket ab.

Hier ist mal die Klasse die ich zum Bearbeiten der Connections nutze.

Java:
 public class POP3ConnectionManager extends Thread {

    private Socket socket;
    private BufferedWriter outToClient;
    private BufferedReader inFromClient;
    public static final String OKMSG = "+OK ";
    public static final String ERRORMSG = "-ERR ";
    public static final boolean OKFLAG = true;
    public static final boolean ERRORFLAG = false;
    private String willkommenNachricht = "Willkommen auf dem RNP POP3 Server!";
    private String sentence;

    private POP3ConnectionManager() {
    }

    public POP3ConnectionManager(Socket socket) throws IOException {
        this.socket = socket;
        outToClient = new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream()));
        inFromClient = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        sende(willkommenNachricht, POP3ConnectionManager.OKFLAG);
        sende("Test fehler", POP3ConnectionManager.ERRORFLAG);
    }

    @Override
    public void run() {
        while (true) {
            try {
                sentence = inFromClient.readLine();
                System.out.println("Eingabe: " + sentence);
                System.out.println("Befehl suche ergab: " + POP3Befehle.sucheBefehl(sentence));
            } catch (IOException ex) {

            }

        }
    }

    public void sende(String msg) {
    }

    public void sende(String[] msg) {
    }

    public void sende(String msg, boolean status) throws IOException {
        if (status) {
            outToClient.write(POP3ConnectionManager.OKMSG + msg);
        } else {
            outToClient.write(POP3ConnectionManager.ERRORMSG + msg);
        }
        outToClient.newLine();
        outToClient.flush();
    }

    public void sende(String[] msg, boolean status) {
    }
}

Das Problem hierbei ist nun folgendes.
Ich sende an den Server die wilkommens nachricht, gefolgt von einen Carriage return line feed (\r\n). Ansonsten sind die Ausgaben bei dem Client halt alle in einer Zeile und werden unleserlich, ganz zu schweigen das etablierte pop3 Clienten wie Thunderbird etc. (damit muss der Server kompatibel sein) damit nichts anfangen könnten.
Tippe ich nun aber einen Befehl in die Konsole und sende ihn an den Server bekomme ich beim ersten Mal ein totales kauderwelsch zurück.
So sieht die Ausgabe des Servers aus:
Code:
run:
Starte Client
Starte Server
Warte auf Verbindungswunsch auf Port 11000
Warte auf Verbindungswunsch auf Port 11000
Eingabe: ��¬�� �� ��'�� �� �� Helo
Befehl suche ergab: -1
Eingabe: helo
Befehl suche ergab: 0

Eingabe: ist was der Client geschrieben hat, wie bekomme ich diese komischen Zeichen da weg?
Zumal ich das Problem dann bei jeder Ausgabe an den Client haben werde.
nur ein \n hat das gleiche Problem zur Folge und dann ist auch noch alles komisch verschoben.
Habe es auch mit einem Printstream versucht aber auch das hat nichts gebracht.

Mach ich hier essenziell etwas falsch?

Ich habe schon überlegt ob man den inputStream nach jedem senden eines Befehls einfach leert, nur leider gibt es dafür keinen Befehl und manuell leeren funktioniert nicht da der Stream nichts enthält bis der Client einmal enter gedrückt hat ....

MFG und danke
Marc
 
Ich hab das ganze mal ausprobiert.

Einen JavaClient der per Socket eine Nachricht schickt.
telnet direkt aus der Konsole.
Alles ohne "Kauderwelsch".

Dann Putty - telnet
und plötzlich war da der unentzifferbare Mist vorhanden.
Ich denke, daß es sich dabei um eine spezielle Handshake-Methode handelt die bei Putty auf on ist.
wandelt man das in Character kommt folgendes heraus.
Code:
65533
65533
31
65533
65533
32
65533
65533
24
65533
65533
39
65533
65533
1
65533
65533
3
65533
65533
3

Was das bedeutet. Keine Ahnung.

Aber ich gehe nicht davon aus, daß das ein Mangel an deiner bisherigen Server Implementierung ist.
Ich gehe davon aus, das du einfach diesen "Handshake", wenn es denn einer sein soll, handeln mußt.
 

Neue Themen


Zurück
Oben