簡體   English   中英

通過telnet發送數據而無需按Enter鍵

[英]Send data over telnet without pressing enter

我最近開始搞亂Java套接字和telnet ......

我希望用戶能夠連接到服務器,只需鍵入一個字母並將其發送到服務器,而無需按Enter鍵發送它。 我確定服務器沒有辦法設置它,但也許telnet有一個參數或什么可以允許這個?

也許如果我讓用戶在運行telnet之前輸入stty cbreakstty raw ,這會有用嗎? (僅限UNIX,我知道!)

如果我可以通過telnet來執行此操作,那么我將不得不為此功能編寫一個特殊客戶端...

這里實際上服務器請求一個辦法解決:這就是所謂的telnet選項協商 通常,當您在其他端口上使用端口23和“cooked”(或“line”)模式時, telnet將默認在“原始”模式下配置本地tty。 行模式是您進行簡約本地編輯的地方,當您點擊返回時會發送數據。

禁用linemode后,您可以單獨配置本地echo等內容。

編輯:我認為合理的順序是:

255, 253, 34,  /* IAC DO LINEMODE */
255, 250, 34, 1, 0, 255, 240 /* IAC SB LINEMODE MODE 0 IAC SE */
255, 251, 1    /* IAC WILL ECHO */

這啟用了TELOPT_LINEMODE (34),然后將行模式LM_MODE0 (我認為這是告訴客戶端不做任何本地編輯的正確方法)。 最后它說WILL ECHO表示服務器將回顯(因此客戶端不會)。

客戶端(如果它支持telnet協商)將回復像IAC blah blah或“引用”序列的序列,如IAC SB ... IAC SE ,您可以檢測並過濾掉輸入流。

您應該可以通過telnet選項協商來執行此操作。 協議默認為半雙工模式,並且至少對於交互式會話,服務器應協商抑制前進選項回顯選項

在最低限度你可以在會話開始時吐出ff fb 01 ff fb 03 (將回顯,將抑制 - 反超),然后用ff fb 01回復任何ff fd 01 (做回聲)(將回聲)並用ff fb 03回復任何ff fd 03 (做抑制前進)(將禁止前進)。

編輯添加Ben Jackson提到的線路模式談判是一個更好的答案。 對於大多數連接23以外端口的客戶端,抑制前進是不夠的。

但是我認為你遇到的另一個問題是Java正在發送Unicode字符。 例如,當你說(char)0xff ,Java假設你指的是UTF-16字符U+00ff ,即ÿ 它可能使用UTF-8編碼通過套接字發送它,因此telnet客戶端看到兩個字節:它傳遞的c3 bf並顯示為ÿ

您可以做的是明確告訴Java使用ISO-8859-1編碼。 例如,您之前可能已經做過類似的事情:

out = new PrintStream(connection.getOutputStream());
out.print((char)0xff);  // sends 0xc3 0xbf
out.print((char)0xfb);  // sends 0xc3 0xbb
out.print((char)0x01);  // sends 0x01
out.flush();

相反,您可以使用OutputStreamWriter指定所需的編碼:

out = new OutputStreamWriter(connection.getOutputStream(), "ISO-8859-1");
out.write((char)0xff);  // sends 0xff
out.write((char)0xfb);  // sends 0xfb
out.write((char)0x01);  // sends 0x01
out.flush();

您需要查看telnet客戶端的文檔(例如手冊頁)。

例如,我的(Linux上的krb5-1.6 telnet實現)有一個mode character命令,它關閉本地線路緩沖並立即發送大多數字符。

編輯:

在某些其他客戶端(例如PuTTY)中禁用本地行編輯具有相同的結果。 PuTTY還具有可能有用的raw連接模式。

請注意,如果您不介意在服務器上實現TELNET協議的某些部分,您還可以遠程禁用本地線路編輯(LINEMODE TELNET選項)。

如果你不關心交互性,你也可以使用netcat:

echo -n X | nc host 7777

不幸的是,在許多系統(例如我的)上,netcat使用線路緩沖的I / O.

我的建議是為此目的使用netcat 它可以像即時通訊一樣,無需按Enter鍵。 搜索netcat教程會返回大量視頻。

要配置telnet以在不按Enter的情況下發送數據,應禁用行模式選項。 這是通過mode telnet子命令完成的:

telnet> mode character

這樣可以在時間模式下啟用角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM