代码之家  ›  专栏  ›  技术社区  ›  Mohamad Alhamoud

未按预期打印Java服务器答复

  •  0
  • Mohamad Alhamoud  · 技术社区  · 15 年前

    我正在构建一个简单的客户机-服务器程序,我主要有:

    FTPClient ftp = new FTPClient("www.kernel.org");
    ftp.getReply();
    ftp.sendCommand("USER " + "anonymous");
    ftp.getReply();
    ftp.sendCommand("PASS " + "anonymous");
    ftp.getReply();
    String com="";
    while (!com.equalsIgnoreCase("quit")){
        System.out.println("Enter your Commands . or Enter quit");
        BufferedReader Keyboard = new BufferedReader(new InputStreamReader(System.in));
        com = Keyboard.readLine();
        ftp.sendCommand((com));
        ftp.getReply();
        System.out.println("===============");
    }
    ftp.close();
    

    问题出在getReply()函数中,该函数是:

    public void getReply() throws IOException {
        String line="";
        while (br.ready())
        {
            line = br.readline();
            System.out.println(line);
            System.out.flush();
        }
    }
    

    br 是BufferedReader。
    现在所有的问题是当程序启动时,直到我按下 Enter 或者任何命令,当我一步一步调试程序时,所有的东西都工作得很好 readline 我应该用别的什么?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Andrzej Doyle    15 年前

    问题可能是服务器响应的结尾不包含换行符。BufferedReader的 readLine 方法将阻塞,直到接收到一行数据,其中“一行”由一些字符组成 后跟换行符 (或流的尽头)。因此,如果没有收到换行符,readLine调用将不会返回。

    在这种情况下,BufferedReader对您没有任何好处。最好自己使用底层读卡器,读入一个数组并在它一进来就发出输出,例如:

    final char[] buffer = new char[256]; // or whatever size you want
    int nRead;
    while ((nRead = reader.read(buffer)) != -1)
    {
        System.out.println(new String(buffer, 0, nRead));
        System.out.flush();
    }
    

    中的条件 while 如果您以前不习惯它,那么这里的循环可能看起来很混乱,但是它将读取操作(读入缓冲区)与检查流的结尾是否未到达结合起来。同样,在 String 在while循环中,考虑到缓冲区可能没有完全填满,因此只使用了提供的尽可能多的字符。

    请注意,这个特定的片段保持循环,直到流是空的;您可能希望在特定的情况下添加另一个退出条件。

    推荐文章