1

我为一所学校制作了这个程序,它涉及一个 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());
}
4

2 回答 2

3

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

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

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

于 2012-04-11T03:21:18.640 回答
2

InputStream从您创建Socket. 您是否可以在请求用户名之前清除数据,例如调用in.nextLine();和丢弃数据,或者通过调用clientinput.skip(clientinput.available());尝试在请求用户名之前执行此操作 - 即在创建Scanner.

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

于 2012-04-11T02:47:44.123 回答