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