Ich arbeite für eine große Organisation, die viele verschiedene Standorte in einem landesweiten Netzwerk unterstützt. Unser Lieferant liefert Diagnosetools für die Hardware, die wir an jedem Standort verwenden. Auf die Diagnose und Berichte wird über Telnet zugegriffen.Senden von Telnet-Befehlen und Lesen der Antwort mit Java
Das Problem ist, wir wollen alle Websites gleichzeitig überwachen und derzeit können wir sie nur einzeln überprüfen (über Telnet).
Ich habe bereits etwas gebaut, das Runtime.exec(String)
verwenden wird, um Ping-Befehle an jede IP-Adresse zu senden. Aber jetzt möchte ich in der Lage sein, bestimmte Befehle automatisch mit den Diagnose- und Berichtstools des Herstellers zu senden. Irgendwelche Ideen über den besten Weg, dies zu tun? HINWEIS: Wir haben ein hybrides System - einige der Sites sind hinter einer Firewall, andere nicht. Eine vollständige Lösung wäre ideal, aber ich werde mich auch für eine Teillösung entscheiden.
Könnte es so einfach sein wie die Eingabe- und Ausgabeströme des Process-Objekts, das von Runtime.exec(String)
zurückgegeben wird, und meine Befehle an die Eingabe senden und die Antwort auf der Ausgabe lesen? Oder sollte ich eine Verbindung zu Port 23 (dem üblichen Telnet-Port) herstellen und mich dann wie jedes andere Client-Server-System verhalten? Oder etwas ganz anderes?
Ich bin weiterhin Dinge auszuprobieren, gerade an diesem Punkt Brainstorming ...
CODE: (sensible Informationen entfernt)
void exec(String ip)
{
Socket sock = null;
BufferedReader br = null;
PrintWriter pw = null;
try
{
sock = new Socket(ip, 23);
br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
pw = new PrintWriter(sock.getOutputStream());
this.read(br);
System.out.println("Sending username");
pw.println("username");
this.read(br); // Always blocks here
System.out.println("Sending password");
pw.println("password");
this.read(br);
pw.close();
br.close();
sock.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
void read(BufferedReader br) throws IOException
{
char[] ca = new char[1024];
int rc = br.read(ca);
String s = new String(ca).trim();
Arrays.fill(ca, (char)0);
System.out.println("RC=" + rc + ":" + s);
//String s = br.readLine();
//
//while(s != null)
//{
// if(s.equalsIgnoreCase("username:"))
// break;
//
// s = br.readLine();
//
// System.out.println(s);
//}
versucht, aber readline() sperrt. Ich lege die readLine() in eine Schleife, um alle empfangenen Zeilen zu lesen, aber sie blockiert fast sofort. Was ich sehe ist: – BigMac66
Verdammt Return-Taste! Was ich sehe, ist der Name des Verkäufers \ n Leerzeile \ n Benutzername: \ n Und es friert an diesem Punkt ein. Ich weiß, dass readLine() blockiert, so dass ich vermute, dass es auf ein EOF wartet, aber nie einen bekommt, so dass ich nie meinen Benutzernamen usw. senden kann. Das ist genau die geringe Detailtiefe, die ich vermeiden möchte. Sicher könnte ich nach Benutzername suchen: und einfach nicht die nächste Zeile lesen, aber ich möchte vermeiden, meine eigene Telnet-App zu schreiben :) – BigMac66
Auf die eine oder andere Weise müssen Sie warten, bis der Benutzername vor dem Senden des Benutzernamens gefragt wird, also im Grunde Sie müssen immer noch Ihre eigene "Telnet App" schreiben. Aber für Ihr aktuelles Problem sollten Sie zwei Threads verwenden, einen zum Lesen und einen zum Senden von Antworten zur richtigen Zeit. –