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