我有一个用Java6编写的Solaris守护程序。客户端可以使用telnet样式接口连接到它。他们telnet到一个特定的端口,我读取输入行并对其进行操作。
有一点我需要提示用户输入密码,当他们输入密码时我想禁用字符回显给telnet客户端。
代码有一个Socket对象,并从套接字的getInputStream()结果创建一个InputStream,然后从InputStream读取和缓冲字符,在cr / lf边界上分解它们。
我无法在InputStream或Socket上看到任何属性来禁止将字符回显给客户端。
有人能否朝着正确的方向推动我?
答案 0 :(得分:4)
听起来你需要构建一个支持no echo etc命令的简单网络虚拟终端。你应该在SO上提到一个很好的答案:Telnet Server
答案 1 :(得分:2)
你应该了解回声的来源。 TCP连接和java InputStreams本身不提供echo。用户正常运行的telnet程序以“本地回显”模式启动,这意味着它将用户键入的所有内容回显到用户的屏幕。当telnet客户端连接到实际的telnet服务器时,它通常协商“远程回声”模式,在这种情况下远程系统提供回声。当telnet连接到其他东西时,如HTTP或SMTP服务器,它只会保持本地回显模式。
用户可以发出命令来关闭客户端中的本地回显,但要求用户执行此操作不是非常用户友好。正如另一个答案所说,如果要打开和关闭回显,则需要增强服务器以支持telnet协议,然后与客户协商远程回声。
如果你这样做,你也会遇到一次一行与一次性角色的问题。 Telnet以一次一行的模式启动。它本地支持像backspace那样的行编辑键,并且只在用户返回时将该行发送到服务器。如果您正在进行远程回声,那么您需要在用户键入时回显字符,而不是在他返回后。因此,您必须一次支持角色并在服务器中实现行编辑。
您应该仔细查看服务器主机上的telnet服务器程序。也许可以使用现有的telnet服务器作为程序的前端,而不是重新实现它所做的一切。祝你好运。