Telnet, VT102, GUI

Tomek Ch

Grünschnabel
Hallo,

objektorientierte Programmierung ist mein täglich Brot, ich arbeite aber hauptsächlich mit stateless Programmiersprachen wie PHP.

Mit Java habe ich während des Studiums programmiert, das ging aber nicht über ein paar einfache Konsolenanwendungen hinaus.

Ich habe mich für ein Testprojekt in JAVA entschieden, da ich im Glauben bin, dass meine Anwendung dann plattformunabhängig ist. Bitte korrigiert mich hier.

Nun zum Testprojekt:
Eine "Konsolenanwendung" läuft über einen VT102 Terminal Emulator über das TELNET Protokoll. Diese Konsolenanwendung würde ich gerne mit einer neuen GUI ausstatten. Prinzipiell sendet man etwas an die Anwendung und es kommt ein Response zurück.

Würde man in JAVA nun einen eigenen Thread programmieren, der für das Senden und empfangen verantwortlich ist? Die Verbindung soll ja, bis zum Schließen des Programms, geöffnet bleiben. Wenn nein, was ist sonst die beste herangehensweise?
Weiß jemand, woran ich erkennen kann, dass ein Datenstream den ich empfange zu Ende ist, und nichts mehr hinterherkommt? Gibt es so einen Indikator im Telnet Protokoll? Ich konnte leider nichts derartiges finden. Denn dann stellt sich auch die Frage, wann höre ich auf den Stream zu lesen?

Der nächste Schritt ist die Interpretation der empfangenen Daten. Ich habe ein PERL-Modul gefunden http://www.ivarch.com/programs/termvt102.shtml, welches VT102 emuliert und mit dem ich quasi lesen kann, was auf dem Bildschirm angezeigt werden würde. Beispielsweise: In Zeile 5 Zeichen 10 ist das Zeichen "A". Da es viele verschiedene Escape- und Kontrollsequenzen gibt, wäre so ein Modul für mein Testprojekt extrem nützlich.

Der letzte Schritt ist dann die GUI. Die empfangenen Daten müssen interpretiert werden (was sich durch das eben genannte Modul vereinfachen würde) und dann entsprechend in die GUI übertragen werden. In "was" würde man die GUI programmieren? Ein Stichwort was ich schon öfter gelesen habe ist SWT oder Swing.. kann mich da jemand in die richtige Richtung weisen? Plattformunabhängigkeit ist wie gesagt ein Thema.

Ich danke jetzt schon für alle Hinweise und Tipps.

Viele Grüße!
 
Hi

Ich habe mich für ein Testprojekt in JAVA entschieden, da ich im Glauben bin, dass meine Anwendung dann plattformunabhängig ist. Bitte korrigiert mich hier.
Generell stimmt das.
Drei "Aber":
1) muss Java am Zielrechner installiert sein. Sollte aber kein großes Problem darstellen.
2) gibt es ein paar spezielle Programmierfehler, die das Programm PF-abhängig machen.
Sind aber meistens ohne übermäßigen Aufwand ausbesserbar.
3) Wenn das Java-Programm Nicht-Java-DLLs und ähnliches verwendet sind diese uU. PF-abhängig.
Würde man in JAVA nun einen eigenen Thread programmieren, der für das Senden und empfangen verantwortlich ist? Die Verbindung soll ja, bis zum Schließen des Programms, geöffnet bleiben. Wenn nein, was ist sonst die beste herangehensweise?
Werden da ständig Daten geschickt oder nur bei einer Aktion vom Benutzer?

Weiß jemand, woran ich erkennen kann, dass ein Datenstream den ich empfange zu Ende ist, und nichts mehr hinterherkommt? Gibt es so einen Indikator im Telnet Protokoll? Ich konnte leider nichts derartiges finden. Denn dann stellt sich auch die Frage, wann höre ich auf den Stream zu lesen?
Verwendest du da irgendeine Telnetklasse oder pure Sockets?
Der nächste Schritt ist die Interpretation der empfangenen Daten. Ich habe ein PERL-Modul gefunden http://www.ivarch.com/programs/termvt102.shtml, welches VT102 emuliert und mit dem ich quasi lesen kann, was auf dem Bildschirm angezeigt werden würde. Beispielsweise: In Zeile 5 Zeichen 10 ist das Zeichen "A". Da es viele verschiedene Escape- und Kontrollsequenzen gibt, wäre so ein Modul für mein Testprojekt extrem nützlich.
Ist das eine Frage?
Der letzte Schritt ist dann die GUI. Die empfangenen Daten müssen interpretiert werden (was sich durch das eben genannte Modul vereinfachen würde) und dann entsprechend in die GUI übertragen werden. In "was" würde man die GUI programmieren? Ein Stichwort was ich schon öfter gelesen habe ist SWT oder Swing.. kann mich da jemand in die richtige Richtung weisen? Plattformunabhängigkeit ist wie gesagt ein Thema.
Swing ist ein fixer Teil von Java, ist also PF-unabhängig.
Man kann damit relativ leicht "normale" GUIs mit Textfeldern/Buttons/etc machen (codemäßig) oder mit Zusatzsoftware zum Compiler auch grafisch zusammenklicken.

Gruß
 
Drei "Aber":
1) muss Java am Zielrechner installiert sein. Sollte aber kein großes Problem darstellen.
2) gibt es ein paar spezielle Programmierfehler, die das Programm PF-abhängig machen.
Sind aber meistens ohne übermäßigen Aufwand ausbesserbar.
3) Wenn das Java-Programm Nicht-Java-DLLs und ähnliches verwendet sind diese uU. PF-abhängig.

OK, verstehe.

Werden da ständig Daten geschickt oder nur bei einer Aktion vom Benutzer?

Eigentlich nur bei einer Aktion vom Benutzer. Es kann aber passieren, dass Daten kommen um den Terminal-Bildschirm zu füllen, und kurz darauf nochmal Daten um beispielsweise mit Hilfe von Escape-Sequenzen ein "Popup" anzuzeigen. Hier schließt sich auch die Frage an meines ersten Beitrages an, ob ich erkennen kann, ob der Server noch vor hat Daten zu senden.
Generell ist zur Interaktion aber ein Login nötig, so dass ein Trennen der Verbindung, während keine Interaktion stattfindet, eher nicht in Frage kommt.

Verwendest du da irgendeine Telnetklasse oder pure Sockets?
Ich denke, ich würde gerne eine Telnetklasse verwenden. Warum das Rad zwei Mal erfinden und sich mit Sockets quälen. Was denkst du?

Ist das eine Frage?
Die Frage fehlte tatsächlich. Ich konnte leider kein solches Modul für Java finden, hat hier vielleicht noch jemand einen Tipp?

Swing ist ein fixer Teil von Java, ist also PF-unabhängig.
Man kann damit relativ leicht "normale" GUIs mit Textfeldern/Buttons/etc machen (codemäßig) oder mit Zusatzsoftware zum Compiler auch grafisch zusammenklicken.
"Normale" GUIs klingt so, als könnte man schnell an die Grenzen von Swing stoßen .. ?


Auf jeden Fall schonmal danke für deine Antwort.
 
Hi Tomek CH und herzlich willkommen hier :)

erstmal ein großes Lob dass du dir so viele Gedanken schon vorab über die Planung deines Projektes macht. Sieht man leider immer seltener, die meisten schreiben (hier) nur so was wie: Das will ich haben, wie geht das?

Nun zu deinen Fragen:
Hatte auch mal so was ähnliches geplant und dafür die telnet-Klassen von apache verwendet. Ist quasi ne Bibliothek mit einigen sehr praktischen Klassen (org.apache.commons.net.telnet.*) die für die Kommunikation mit einem Telnet-Server zuständig sind.
Hier ein paar Links dazu: apache commons telnet doku, Beispiel hierzu

Mit Swing kann man schon sehr viel machen, keine Angst, du wirst kaum so schnell an die Grenzen des Frameworks stoßen ;) Es gibt halt ein paar speziellere Sachen, die man zwar auch mit Swing schreiben kann, wobei andere Frameworks aber leichter und schneller zu schreiben sind.

Gruß
BK
 
Da Java meines Wissens keine fixe Telnetlib eingebaut hat musst du dann auf eine von einem Dritthersteller ausweichen. Die Sache mit den Threads und Verbindsenden hängt dann davon ab, welche Lib das ist.

Zu dem PERL-Modul: Kannst du mir einen Link geben, damit man genauer Infos darüber bekommt?

Swing: Ich meinte nur, dass es eher auf Textfeld-Button-etc-GUIs ausgerichtet ist statt 2D-Spiele etc.
Möglich ist letzteres auch, gibt aber speziellere Sachen dafür.

Gruß

PS. Nachträglich Willkommen bei tutorials.de :)
 
Vielen Dank für die zahlreichen und schnellen Antworten bisher.

Die Apache commons sind mir nach einiger weiterer Recherche auch aufgefallen. Die meisten Sachen die man findet, verwenden sie. Da es weit verbreitet zu sein scheint, es steht wohl auch eine größere Community dahinter, gehe ich davon aus, dass es vermutlich auch das sinnvollste und beste ist, um in Java mit Telnet zu arbeiten.

Die Sache mit den Threads und Verbindsenden hängt dann davon ab, welche Lib das ist.
Mir fehlt durch die Stateless-Programmierung die Vorstellung, wie die Verbindung aufrecht erhalten wird, und bin deswegen auf einen Thread gekommen, der die Kommunikation übernimmt. Als Alternative könnte ich mir nur eine Endlosschleife vorstellen, die ständig am InputStream horcht, und die sonstige Applikation "blockiert".

Zu dem PERL-Modul: Kannst du mir einen Link geben, damit man genauer Infos darüber bekommt?
Ja, hatte ich im ersten Post angegeben, hier nochmal: http://www.ivarch.com/programs/termvt102.shtml
Ein Fachwort in dem Zusammenhang scheint "Screen-scraping" zu sein. Man analysiert also nicht den ankommenden Datenstream selbst, sondern emuliert ein Terminal, und erzeugt sich beispielsweise eine 80x24 Matrix mit den Daten, wie sie im Terminal angezeigt werden würden. Dadurch lassen sich die Daten auch einfacher interpretieren. Beispiel: Feld "Vorname" in der Terminalapplikation fängt bei Koordinate {10, 5} an, während ich mich im Datenstream durch Escapesequenzen und andere Bytes hätte kämpfen müssen.

Der Perl-Code gibt einen Eindruck davon, was bei so einer Terminal Emulation beachtet werden muss, allerdings kann ich mir im Moment noch keinen Rewrite des Moduls für Java vorstellen.
Ich hab schon ein paar gute Resourcen gefunden, die sich mit Terminals beschäftigen, vor allem
http://tldp.org/HOWTO/html_single/Text-Terminal-HOWTO/#termcap2
ist eine extrem gute Informationsquelle. Da muss mich sich aber erstmal durcharbeiten.
Generell ist mein Eindruck, dass es an guten und vollständigen Dokumentationen zu Terminals mangelt, gerade was die Steuer- und Escape-Sequenzen angeht. Da ist das PERL-Modul eine sehr willkommene zusätzliche Quelle, die auch auf programmiertechnischer Seite etwas Licht ins Dunkel bringt.

Ich werde jetzt langsam versuchen einen Einstieg in die praktische Umsetzung des Projekts zu finden. Ein Swing-Tutorial dafür zu verwenden wird sicherlich nicht falsch sein, um ein Grundgerüst zu bauen, in dem die Telnet-Kommunikation einen festen Platz hat. Die GUI kann ich ja erstmal verwenden um Testbefehle abzusetzen und den Output des Servers zu analysieren/interpretieren.
Habt ihr andere Vorschläge, sollte ich vielleicht erst mit der Backendprogrammierung auf Konsolenbasis anfangen? Ist es leicht das ganze dann in eine GUI Applikation zu portieren (speziell beziehe ich mich auf die Telnet Kommunikation)?

Danke für die Willkommensgrüße!
 
Ich würde mit der GUI anfangen, nicht zuerst Konsole.
Da du aber noch keine/wenig Erfahrung mit Swing hast:
Bau zuerst einmal die GUI, ohne dass sich hinter den Buttons wirklich was mit Telnet tut.
Nur irgendeine GUI-mäßige Reaktion, damit man weiß, dass der Button funktioniert etc.

Da du bei Swing UND Telnet noch unsicher bist kommst du sonst schnell durcheinander.

Die Links muss ich mir erst noch durchlesen...
 
Hallo!

Ich habe mich nun in verschiedene Themen der Java-Programmierung eingelesen, darunter Swing und Threads.

Der nächste Schritt soll sein eine Telnet-Verbindung per GUI-Button aufzubauen, in einem Thread den Inputstream lesen und ausgeben, und über einen anderen Button die Verbindung wieder zu beenden.

Einen generellen Plan des Aufbaus des Projekts habe ich auch schon, im Anhang ein Klassendiagramm.

Der TelnetClient kümmert sich um Verbindung und Telnet-negotiation, verarbeitet also alle Telnet-spezifischen Daten. Dazu startet er einen Reader-Thread der die Daten liest und je nach Bytes an den TelnetClient oder an den VT220 weitergibt. Der VT220 ist der VT220 Emulator der an ein Terminal (einen Screen) angeschlossen ist. Im VT220 werden also u.A. die Escapesequenzen interpretiert und verarbeitet, während das Terminal die Enddarstellung auf einem imaginären Bildschirm repräsentiert (charMatrix).

Was haltet ihr von dem ersten Entwurf? Wo könnte es Probleme geben? Habt ihr Tipps zur Implementierung?
 

Anhänge

  • ClassDiagram1.jpg
    ClassDiagram1.jpg
    109 KB · Aufrufe: 11
Hallo!

Vielen Dank für die Antworten soweit. Habe meine Planung verfeinert und komme jetzt vermutlich alleine zurecht. Teilprobleme würde ich aber trotzdem gerne hier im Forum diskutieren, dieser Thread kann aber gerne geschlossen werden.

Für alle die mitlesen:
apache net commons bieten einen super Einstieg um mit Telnet anzufangen. Danach muss man schon wissen was man will und braucht. Das Java-Insel Buch hilft eigentlich bei allen Themen weiter :)
 
Zurück