Telnet服务器返回奇怪的字符

时间:2012-04-11 02:41:12

标签: java character telnet

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

2 个答案:

答案 0 :(得分:3)

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

telnet服务器实现telnet协议,如RFC 854中所述(更新为RFC 5198支持Unicode)。主RFC指定了由telnet客户端或服务器发送的许多特殊序列。

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

答案 1 :(得分:2)

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

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