未按预期打印Java Server答复

时间:2010-11-15 11:09:30

标签: java client-server

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

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 个答案:

答案 0 :(得分:1)

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

在这种情况下,BufferedReader对你没有任何帮助。你最好自己使用底层的Reader,读入数组并在输出后立即发出输出,如下所示:

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循环中的条件可能看起来令人困惑,如果您以前不习惯它,但它将读取操作(读入缓冲区)与流的末尾检查结合起来没有达到。同样,while循环中String的构造考虑到缓冲区可能没有完全填充的事实,因此只使用了提供的字符数。

请注意,此特定代码段会一直循环,直到流为空;您可能希望在特定情况下添加另一个退出条件。