Отправка данных по телнету без нажатия Enter - PullRequest
13 голосов
/ 26 декабря 2010

Я недавно начал возиться с сокетами Java и telnet ...

Я хочу, чтобы пользователь мог подключиться к серверу, просто наберите письмо и отправьте его на сервер безнажмите Enter, чтобы отправить его.Я уверен, что у сервера нет способа настроить это, но, возможно, у telnet есть параметр или что-то, что могло бы позволить это?

Может быть, если бы я заставил пользователя набрать stty cbreak или stty raw доработает телнет, это будет работать?(Только UNIX, я знаю!)

Если мне удастся заставить telnet сделать это, это избавит меня от необходимости писать специальный клиент только для этой функции ...

Ответы [ 4 ]

8 голосов
/ 26 декабря 2010

На самом деле - это способ для сервера запросить это: он называется согласование параметров telnet .Обычно telnet по умолчанию настраивает локальный tty в режиме «raw», когда вы используете порт 23 и режим «cooked» (или «line») на других портах.Линейный режим - это то, где у вас есть минималистичное локальное редактирование, и данные отправляются, когда вы нажимаете return.

После отключения линейного режима вы можете отдельно настроить такие вещи, как локальное эхо.

РЕДАКТИРОВАТЬ: Я думаю, что разумнопоследовательность будет выглядеть следующим образом:

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, или последовательностями в кавычках, такими как * 1020.* которые вы можете обнаружить и отфильтровать из входного потока.

3 голосов
/ 26 декабря 2010

Вы должны быть в состоянии сделать это с помощью согласования параметров Telnet. В качестве протокола по умолчанию используется полудуплексный режим, и как минимум для интерактивного сеанса сервер должен согласовать параметр подавление перехода и параметр эха .

Как минимум, вы могли бы просто выплюнуть ff fb 01 ff fb 03 (будет эхом, подавит переход) в начале сеанса, а затем ответить на любой ff fd 01 (сделать эхо) с помощью ff fb 01 (будет отображаться эхо) и ответить на любой ff fd 03 (выполнить подавление продолжения) с помощью ff fb 03 (будет подавление продолжения).

Редактировать , чтобы добавить, что согласование линейного режима, упомянутое Беном Джексоном, является лучшим ответом. Подавление разрешения не будет достаточным для большинства клиентов, подключающихся через порты, отличные от 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();
2 голосов
/ 26 декабря 2010

Вам необходимо просмотреть документацию (например, страницу руководства) для своего клиента telnet.

Например, мой (реализация trnet krb5-1.6 в Linux) имеет команду mode character, которая отключает локальную буферизацию строки иотправляет большинство символов немедленно.

EDIT:

Отключение редактирования локальной линии в некоторых других клиентах, таких как PuTTY, приводит к тому же результату.PuTTY также имеет режим соединения raw, который может быть полезен.

Обратите внимание, что если вы не возражаете против реализации некоторых частей протокола TELNET на сервере, вы также можете отключить редактирование локальной линии (Опция LINEMODE TELNET) удаленно.

Если вам не нужна интерактивность, вы также можете использовать netcat:

echo -n X | nc host 7777

К сожалению, во многих системах (например, в моей) netcat использует I / I с буферизацией строкиО.

1 голос
/ 26 декабря 2010

Я советую использовать netcat для этих целей.Он может вести себя как мессенджер, не нажимая ввод.поиск по netcat возвращает тонны видео.

...