【问题标题】:Telnet server returning strange charactersTelnet 服务器返回奇怪的字符
【发布时间】:2012-04-23 08:33:32
【问题描述】:

我为一所学校制作了这个程序,它涉及一个 telnet 服务器。当我运行它时,它会返回奇怪的字符,例如ÿûÿû。这是输出:

Client connected with the IP /127.0.0.1
Client /127.0.0.1 has entered the username ÿûÿû ÿûÿû'ÿýÿûÿýdcole.

我的代码:

Socket client = serv.accept();

InetAddress clientip = client.getInetAddress();

out("Client connected with the IP " + clientip);

InputStream clientinput = client.getInputStream();
OutputStream clientoutput = client.getOutputStream();

Scanner in = new Scanner(clientinput);
clientoutput.write("Please enter your username: ".getBytes());

String username = in.nextLine();
out("Client " + clientip + " has entered the username " + username + ".");

String pass = "Please enter the password for " + username + ": ";
clientoutput.write(pass.getBytes());

String password = in.nextLine();

if (username.equals("dcole") && password.equals("test")) {
    clientoutput.write("\r\nCorrect password!".getBytes());
} else {
    clientoutput.write("\r\nIncorrect password!".getBytes());
}

【问题讨论】:

    标签: java character telnet


    【解决方案1】:

    真正的问题是,您将 telnet 服务器视为简单地发送和接收字符数据的套接字服务器。不是这样的!

    telnet 服务器实现了RFC 854 中描述的telnet 协议(由RFC 5198 更新以支持Unicode)。主 RFC 指定了一些由 telnet 客户端或服务器发送的特殊序列。

    如果您的客户端要在任何 telnet 服务器上正常工作,它需要正确实施协议。 WATTO 建议的解决方法可能适用于这种情况......但您可能会发现这个(或另一个)telnet 服务器在其他点插入这些“奇怪的字符”。事实上,他们根本不是“奇怪的人物”。它们是 telnet 协议中定义明确的元素,它们意味着什么。

    【讨论】:

    • 我完全同意@StephenC - 它几乎肯定是 telnet 协议的一部分,我似乎忽略了这个用户试图与 telnet 服务器通信的事实。我的回答确实是试图“缓解”用户遇到的问题,而不是像你这样的更正确的答案。我不确定用户试图用他的 Socket 做什么,但我肯定会鼓励正确实现 telnet 协议,而不是简单地通过 Socket 发送字符串。
    【解决方案2】:

    也许在您创建Socket 时,您的InputStream 中有一些脏信息。您是否可以在请求用户名之前清除数据,例如调用in.nextLine(); 并丢弃数据,或者通过调用clientinput.skip(clientinput.available()); 尝试在请求用户名之前执行此操作 - 即在创建Scanner 之后立即执行此操作。

    作为后续,当您与 Telnet 服务器交谈时,我绝对鼓励您遵循@StephenC 的建议 - 您应该实现 Telnet 规范的正确握手和数据传输属性,而不是简单地发送通过 Socket 的字符串。

    【讨论】:

    • 1.不,我使用窗户。 2. 不,我只使用 QWERTY 键盘键(英文)。
    • 在我上面编辑的答案中尝试第 3 点怎么样 - 也许流从创建时开始就很脏。
    • 3.非常感谢!这成功了!
    • 如果您使用 telnet 客户端连接到服务器,最初的“脏输入”可能是客户端尝试与服务器进行 telnet 选项协商(“将回显”等)跨度>
    • @DavidGelhar - 我会将其修改为“极有可能”而不是“可能”。 IMO,选项 3 是个坏建议。它可能有效,但这是错误的方法。 Telnet有一个开放的规范,客户端(比如OP的程序)应该符合规范。
    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 2019-07-05
    • 2017-07-04
    • 2018-03-11
    • 2019-07-27
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    相关资源
    最近更新 更多