# Probleme mit Connection Reset bei Telnet Verbindung



## freehawk (26. Dez 2016)

Hallo zusammen,
ich habe eine Klasse programmiert, die eine Telnet Verbindung öffnet, zwei Kommandos schickt (ein Kommando und ein Quit) und die Empfangen Lines zurückgibt. Nun kommt es immer wieder zu Connection Resets. Vermutlich weil die Verbindung schon weg ist bevor der Reader gelesen hat. Ich habe gedacht, da ich einen Buffered Reader verwende müsste das doch gehen. Ich stehe gerade auf dem Schlauch und komme nicht mehr weiter. Könntet ihr mir einen kleinen Wink mit dem Zaunpfahl geben?


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.ArrayList;


public class TelnetConnection
{
    private String ipAdress;
    private int ipPort;
    private String passWord;
    private boolean connectionParameter = false;
    private Debug debug;
   
    private int timeOut = 200;
   
    private Socket socket = null;
    private PrintStream out = null;
    private BufferedReader in = null;
   
    public TelnetConnection ( String ipAdress , int ipPort , String passWord , Debug debug )
    {
        // Verbindungsparameter muessen uebergeben worden sein
        if ( ! ipAdress.equals("") && ipPort != 0 )
        {
            this.ipAdress = ipAdress;
            this.ipPort = ipPort;
            this.passWord = passWord;
            this.debug = debug;
           
            debug.print ( 2 , "Connection Parameter richtig uebergeben" );
           
            this.connectionParameter = true;
        }
        else
        {
            this.connectionParameter = false;
        }
    }
           
    public ArrayList<String> send ( String command )
    {
        ArrayList<String> lines = new ArrayList<String>();
       
        if ( this.connectionParameter == true )
        {
            try
            {
                // Socket Verbindung aufbauen und Streams aufbauen
                this.socket = new Socket ( this.ipAdress , this.ipPort );
                this.socket.setSoTimeout ( this.timeOut );
               
                this.out = new PrintStream ( socket.getOutputStream() );
                this.in = new BufferedReader ( new InputStreamReader ( socket.getInputStream() ) );
                               
                debug.print ( 2 , "Telnetverbindung geoeffnet!" );
            }
            catch ( NullPointerException e )
            {
                debug.print ( 1 , "Telnetverbindung konnte nicht geoeffnet werden: " + e.getMessage() );
            }
            catch ( IOException e )
            {
                debug.print ( 1 , "Telnetverbindung konnte nicht geoeffnet werden: " + e.getMessage() );
            }
           
            String line = "";
           
            // Kurz warten nach dem Öffnen vor dem Schreiben
            try
            {
                Thread.sleep(10);
            }
            catch ( InterruptedException e1 )
            {
                debug.print ( 3 , "schlafen ging nicht: " + e1.getMessage() );
            }       
           
            // Kommando rausschreiben und Verbindung schliessen
            debug.print ( 2 , "Kommando absetzten: " + command );
            out.println ( command + "\r\nquit\r\n");
           
            // Kurz warten nach dem Schreiben vor dem Lesen
            try
            {
                Thread.sleep(10);
            }
            catch ( InterruptedException e1 )
            {
                debug.print ( 3 , "schlafen ging nicht: " + e1.getMessage() );
            }
           
            while(true)
            {
                try
                {
                    // Einlesen der Rueckgabe
                    line=in.readLine();

                    debug.print( 3 , "gelesen ueber Telnet: " + line );

                    // Wenn null kommt ist die Verbindung geschlossen
                    if ( line == null )       
                    {
                        debug.print( 3 , "Alle Lines eingelesen" );

                        break;
                    }
                    else
                    {
                        // Ergebnis uebernehmen
                        lines.add ( line );
                    }
                }
                catch ( IOException e )
                {
                    // Oder nach Read timed out auch weitergehen
                    if ( ! e.getMessage().equals("Read timed out") )
                    {
                        debug.print ( 3 , "Es konnte nicht gelesen werden IO: " + e.getMessage() );
                    }
                    else
                    {
                        debug.print( 3 , "Timeout beim Lesen --> Lesen gewollt abbrechen! IO" );
                    }               
                    break;
                }
                catch ( NullPointerException e)
                {
                    // Oder nach Read timed out auch weitergehen
                    if ( ! e.getMessage().equals("Read timed out") )
                    {
                        debug.print ( 3 , "Es konnte nicht gelesen werden NP: " + e.getMessage() );
                    }
                    else
                    {
                        debug.print( 3 , "Timeout beim Lesen --> Lesen gewollt abbrechen! NP" );
                    }               
                    break;
                }
            }

            try
            {
                // Verbindung schliessen
                in.close();
                out.close();
                socket.close();
                debug.print ( 2 , "Telnetverbindung geschlossen!" );
            }
            catch ( IOException e )
            {
                debug.print ( 2 , "Telnetverbindung konnte nicht geschlossen werden!" );
            }
            catch ( NullPointerException e )
            {
                debug.print ( 2 , "Telnetverbindung konnte nicht geschlossen werden!" );
            }
           
        }
        // Ergebnis zurueckgeben
        return lines;
    }
   
}
```

Jetzt könnte man natürlich sagen, schicke erst das Kommando, lies dann die Zeilen und schicke dann das quit. Problem dabei ist, dass der Server bei erfolgreichen Kommandos keine Antwort gibt und ich dann quasi das Bye beim Quit als Erfolg auswerte....

Danke

Gruß
Markus


----------



## JuKu (2. Jan 2017)

Wenn du die Verbindung sofort nach dem Senden schließt, kann natürlich auch nichts mehr vom Server gelesen werden!
Außerdem ist nach dem Write evtl. ein flush() notwendig / hilfreich.
Und ersetze das "\r\n" mal durch ein "\n", das sollte meines Wissens reichen.
Deinen Code habe ich jetzt allerdings nicht getestet.


----------

