Senden von Daten über telnet, ohne die EINGABETASTE drücken
Ich habe mir vor kurzem begann Herumspielen mit Java-sockets und telnet...
Ich möchte die Benutzer in der Lage sein dem server zu verbinden, geben Sie einfach einen Buchstaben und Sie an den server gesendet, ohne die EINGABETASTE drücken, um es zu senden. Ich bin sicher, es gibt keine Möglichkeit für den server, um dies einzurichten, aber vielleicht telnet hat einen parameter oder was könnte dies zulassen?
Vielleicht, wenn ich die Benutzer geben stty cbreak
oder stty raw
vor dem ausführen telnet, das würde funktionieren? (Nur bei UNIX, ich weiß!)
Wenn ich telnet zu tun, es spart mir mit zu schreiben, eine spezielle client nur für diese Funktion...
InformationsquelleAutor Matt | 2010-12-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie in der Lage, dies zu tun mit telnet-option verhandelt.
Das Protokoll wird standardmäßig auf Halbduplex-Modus, und mindestens für eine interaktive Sitzung, sollte der server die Aushandlung der suppress go ahead option und echo-option.Auf das Nötigste konnte man nur ausspuckenff fb 01
ff fb 03
(echo, suppress go-ahead), am Anfang von der session, dann beantworten Sie jedeff fd 01
(do echo) mitff fb 01
(echo) und Antwortff fd 03
(do unterdrücken-go-ahead) mitff fb 03
(unterdrücken-go-ahead).Bearbeiten hinzufügen, dass die linemode Verhandlung erwähnt von Ben Jackson ist eine bessere Antwort. Suppress go ahead, nicht genug für die meisten clients, die eine Verbindung auf einen anderen Port als 23.
Aber ich denke das andere problem, Sie laufen in ist, dass Java senden von Unicode-Zeichen. Zum Beispiel, wenn Sie sagen
(char)0xff
-, Java-vorausgesetzt, Sie sind unter Bezugnahme auf UTF-16-ZeichenU+00ff
dieÿ
. Es ist wahrscheinlich senden über den socket unter Verwendung der UTF-8-Codierung, so dass der telnet-client sieht zwei bytes:c3 bf
die es geht auf und zeigt, wieÿ
.Was Sie tun können, ist explizit zu sagen, Java zu verwenden ISO-8859-1-Kodierung. Zum Beispiel, können Sie es bisher getan haben, so etwas wie dieses vor:
Verwenden Sie stattdessen den OutputStreamWriter, um die Kodierung angeben, die Sie möchten:
Brauche ich zu gehen, untere Ebene, oder was?
Siehe meine bearbeitete Antwort für was ist wohl hier passiert
Mit ISO-8859-1 anstatt UTF-8 hat mich davon abgehalten, mit dem erweiterten ASCII-Zeichen (128 bis 255). Ich war vorher senden Sie Sie als unicode-strings (ie, \u2588 für 219), die offensichtlich nicht mehr funktionieren. Stattdessen habe ich versucht, senden Sie als Zeichen, also nur 219 zum Beispiel, und es gibt Sie als � Zeichen. Jeder Weg, dies zu umgehen?
Ich denke, man könnte ein PrintStream und ein OutputStreamWriter zur gleichen Zeit. Rufen Sie
out = new PrintStream(conn.getOutputStream());
UNDrawout = new OutputStreamWriter(conn.getOutputStream(), "ISO-8859-1");
Dann können Sierawout.write((char)0xff);
senden eine einzelne 255 byte, aberout.print("whatever \u2588");
für alles andere.InformationsquelleAutor eater
Gibt es eigentlich ist eine Möglichkeit für den server zu verlangen: Es heißt telnet-option negotiation. In der Regel
telnet
wird standardmäßig die Konfiguration der lokalen tty-im "raw" Modus, wenn Sie port 23 und "gekocht" (oder "Linie") - Modus, die auf anderen ports. Line-Modus ist, wo Sie haben, minimalistischen lokale Bearbeitung und die Daten werden gesendet, wenn Sie drücken Sie die EINGABETASTE.Sobald Sie deaktivieren linemode Sie können individuell konfigurieren, Dinge wie lokale echo.
EDIT: ich denke, eine vernünftige Reihenfolge wäre:
Ermöglicht
TELOPT_LINEMODE
(34) und setzt dann den linemodeLM_MODE
zu0
(was ich denke ist der richtige Weg, zu sagen, der client nicht für eine lokale Bearbeitung). Schließlich heißt esWILL ECHO
Angabe der server wird von echo (so der client nicht).Client (wenn es unterstützt telnet negotiation), wird der Antwort-Sequenzen wie
IAC blah blah
oder "zitiert" - Sequenzen wieIAC SB ... IAC SE
was können Sie erkennen und herausfiltern, der Ihren input-stream.+1 Das sieht aus wie die richtige Antwort. Siehe meine aktualisierte Antwort, wie es zu tun.
InformationsquelleAutor Ben Jackson
Müssen Sie finden Sie in der Dokumentation (z.B. Handbuch Seite) für Ihre telnet-client.
Beispielsweise mine (krb5-1.6 telnet-Implementierung unter Linux) hat eine
mode character
- Befehl, schaltet die Linie lokale Pufferung und sendet die meisten Charaktere sofort.EDIT:
Deaktivierung von Local line editing in einigen anderen clients wie PuTTY, hat das gleiche Ergebnis. PuTTY hat auch eine
raw
Anschluss-Modus, der die von nutzen sein könnten.Bitte beachten Sie, dass wenn Sie nichts dagegen haben, die Durchführung einiger Teile der TELNET-Protokoll auf dem server, können Sie auch deaktivieren Sie Local line editing (LINEMODE TELNET-option) Remote.
Wenn Sie kümmern sich nicht um Interaktivität konnte man auch mit netcat:
Leider auf vielen Systemen (wie meins) netcat verwendet line-buffered-I/O.
InformationsquelleAutor thkala
Mein Rat ist die Verwendung netcat für diese Zwecke. Es kann sich Verhalten, wie instant-messenger, ohne die EINGABETASTE drücken. die Suche nach netcat tutorial gibt Tonnen von videos.
Ich denke, es ist nur, dass sich die Welt ändert sich, und jetzt haben wir-videos, die uns erzählen, wie Sie zu verwenden, Konsole-basierte Programme.. kann ich schätzen den Humor in der it 😉
InformationsquelleAutor Eric Fortis