![](/img/trans.png)
[英]How to enter data to swing.JTextField without pressing the enter key?
[英]Send data over telnet without pressing enter
我最近開始搞亂Java套接字和telnet ......
我希望用戶能夠連接到服務器,只需鍵入一個字母並將其發送到服務器,而無需按Enter鍵發送它。 我確定服務器沒有辦法設置它,但也許telnet有一個參數或什么可以允許這個?
也許如果我讓用戶在運行telnet之前輸入stty cbreak
或stty 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_MODE
為0
(我認為這是告訴客戶端不做任何本地編輯的正確方法)。 最后它說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.