Java 缓冲读取器从用户输入返回意外字符

Java 缓冲读取器从用户输入返回意外字符,java,user-input,bufferedreader,telnet,Java,User Input,Bufferedreader,Telnet,我有一个多聊天服务器客户端程序,我试图在telnet putty窗口中从客户端获取输入。 提示: String login = "2-Enter Username and a password:"; clientoutput.write((login).getBytes()); 用户输入: 这是由BufferedReader读取的: BufferedReader br = new BufferedReader(new InputStreamReader(clientInpu

我有一个多聊天服务器客户端程序,我试图在telnet putty窗口中从客户端获取输入。 提示:

String login = "2-Enter Username and a password:";
        clientoutput.write((login).getBytes());
用户输入:

这是由BufferedReader读取的:

 BufferedReader br = new BufferedReader(new InputStreamReader(clientInput));
        String inputLine;
        String returnMessage;
        while ((inputLine = br.readLine()) != null) {

            // Split input line with space as delimiter using import jar
            String[] words = StringUtils.split(inputLine);

            // Ensure we don't get a null pointer
            if (words != null && words.length > 0) {
                String command = words[0];

            if ("logoff".equalsIgnoreCase(command) || "q".equalsIgnoreCase(command) || "quit".equalsIgnoreCase(command)) {
                logOff();
                break;
                }else 
                    // Log user in
                    try {
                        clientLogIn(clientoutput, words);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

            }
但是,用户输入的第一个单词始终被理解为

ÿÿ

: Eclipse控制台输出:

用户ÿÿÿ已登录

所以我的问题是这个角色是从哪里来的,有没有解决办法

我使用的是WIndows 10和Eclipse版本:2019-03(4.11.0) 构建id:20190314-1200

其他信息: 我尝试捕获用户输入并直接打印到控制台:

if (login.contains("ÿû")) {
            login = login.substring(1);
            System.out.println("New login after removal of unxepected char: " + login);
        } else {
            System.out.println("User eneterd login : " + login);

        }
输出:

用户输入的登录名:-输入用户名和密码:

用户ÿÿÿ已登录//在第一个单词被提取后

  • 您获得了telnet协议特殊字节
    0xff(IAC)
    0xfb(WILL)
  • 如果您需要在应用程序中避免这种情况,请使用此部分(您需要的是“TELNET命令结构”)跳过特定于协议的字节
  • 您获得了telnet协议特殊字节
    0xff(IAC)
    0xfb(WILL)
  • 如果您需要在应用程序中避免这种情况,请使用此部分(您需要的是“TELNET命令结构”)跳过特定于协议的字节

  • 因为您实际上是在编写自己的协议,所以问题似乎是您使用了错误的客户端来测试服务器

    也就是说,telnet并不意味着它是一个通用的TCP客户机,因为它将命令与您试图发送的实际数据一起发送。此外,它可以处理字节,而不是java字符串(当您试图检查字符串开头的奇怪字符时,您注意到了这一点)


    如果您使用类似于
    netcat
    的方法来测试代码,则可以完全避免此问题。

    因为您实际上是在编写自己的协议,所以问题似乎是您使用了错误的客户端来测试服务器

    也就是说,telnet并不意味着它是一个通用的TCP客户机,因为它将命令与您试图发送的实际数据一起发送。此外,它可以处理字节,而不是java字符串(当您试图检查字符串开头的奇怪字符时,您注意到了这一点)


    如果您使用类似于
    netcat
    的工具来测试代码,则可以完全避免此问题。

    无论如何,由于windows通常使用默认字符集将
    0xFF
    字节显示为
    “ÿ”
    ,因此您可能会遇到一些问题。我敢打赌,如果你放弃这一行,下一步将包含你所期望的。最后,你不应该把telnet看作是一行,而是作为一个字节流,至少在你写一个服务器的时候。例如,看看一旦你删除了不想要的字节数组,就把它重新转换成字符串。因为您实际上正在编写自己的协议,所以问题似乎是您使用了错误的客户端来测试它。也就是说,telnet并不意味着它是一个通用的TCP客户端。如果您使用类似于
    netcat
    的工具来测试代码,则可以完全避免此问题。无论如何,由于windows使用默认字符集,因此通常将
    0xFF
    字节显示为
    “ÿ”
    ,因此您可能会遇到一些问题。我敢打赌,如果你放弃这一行,下一步将包含你所期望的。最后,你不应该把telnet看作是一行,而是作为一个字节流,至少在你写一个服务器的时候。例如,看看一旦你删除了不想要的字节数组,就把它重新转换成字符串。因为您实际上正在编写自己的协议,所以问题似乎是您使用了错误的客户端来测试它。也就是说,telnet并不意味着它是一个通用的TCP客户端。如果您使用
    netcat
    之类的工具来测试代码,您可能会完全避免这个问题。您好,我想我明白了,但如何通过编程实现这一点?@dancingbush从技术上讲,您需要使用字节而不是行。首先,您需要了解telnet如何跳过所有协议特定的字节。顺便说一句,你写了一个“多聊天服务器客户端程序”,你确定你的代码中真的需要所有特定于telnet的东西吗?@AleksandrSemyannikov他们的代码中没有特定于telnet的东西。这些命令来自PuTTY,因为它是telnet客户端,而不是特定聊天协议的客户端。@FedericoklezCulloca,当然,这正是我的意思,我认为根本不需要处理这些字节。dancingbush应该记住,符号与telnet协议相关,不会出现在适当的环境中。@AleksandrSemyannikov好的,我被“你确定你的代码中真的需要所有telnet特定的东西吗?”。嗨,我想我明白了,但我如何以编程方式做到这一点?@dancingbush,您需要使用字节而不是行。首先,您需要了解telnet如何跳过所有协议特定的字节。顺便说一句,你写了一个“多聊天服务器客户端程序”,你确定你的代码中真的需要所有特定于telnet的东西吗?@AleksandrSemyannikov他们的代码中没有特定于telnet的东西。这些命令来自PuTTY,因为它是telnet客户端,而不是特定聊天协议的客户端。@FedericoklezCulloca,当然,这正是我的意思,我认为根本不需要处理这些字节。dancingbush应该记住,符号与telnet协议相关,不会出现在适当的环境中。@AleksandrSemyannikov好的,我被“你确定你的代码中真的需要所有telnet特定的东西吗?”所抛弃。