1

我有一个用 Java6 编写的 Solaris 守护进程。客户端可以使用 telnet 风格的界面连接到它。他们远程登录到一个特定的端口,我读取输入行并对其进行操作。

在某一时刻,我需要提示用户输入密码,当他们输入时,我想禁用将字符回显回 telnet 客户端。

该代码有一个 Socket 对象,并从套接字的 getInputStream() 结果创建一个 InputStream,然后从 InputStream 读取和缓冲字符,在 cr/lf 边界上分解它们。

我在 InputStream 或 Socket 上都看不到任何属性来禁用将字符回显回客户端。

有人可以将我推向正确的方向吗?

4

2 回答 2

4

听起来您需要构建一个支持 no echo 等命令的简单网络虚拟终端。您应该在 SO 上参考一个很好的答案:Telnet Server

于 2008-12-15T07:23:43.677 回答
2

您应该了解回声的来源。TCP 连接和 java InputStreams 本身不提供回显。用户运行的 telnet 程序通常以“本地回显”模式启动,这意味着它将用户键入的所有内容回显到用户的屏幕上。当 telnet 客户端连接到实际的 telnet 服务器时,它通常会协商“远程回显”模式,在这种情况下,远程系统会提供回显。当 telnet 连接到其他东西时,比如 HTTP 或 SMTP 服务器,它只是停留在本地回显模式。

用户可以发出命令来关闭客户端中的本地回显,但要求您的用户这样做并不是很友好。正如另一个答案所说,如果要打开和关闭回显,则需要增强服务器以支持 telnet 协议,然后与客户端协商远程回显。

如果这样做,您还将遇到一次一行与一次字符的问题。Telnet 以一次一行的方式启动。它支持本地退格等行编辑键,并且仅在用户点击返回时将行发送到服务器。如果您正在执行远程回显,那么您需要在用户键入字符时回显字符,而不是在他点击返回之后。因此,您必须支持一次一个字符并在服务器中实现行编辑。

您应该仔细查看服务器主机上的 telnet 服务器程序。可以使用现有的 telnet 服务器作为程序的前端,而不是重新实现它所做的一切。祝你好运。

于 2009-02-22T14:50:59.697 回答