Вы должны быть в состоянии сделать это с помощью согласования параметров 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();