我正在构建一个简单的客户端 - 服务器程序,我主要有:
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
中的问题是我应该使用别的东西还是什么?
答案 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
的构造考虑到缓冲区可能没有完全填充的事实,因此只使用了提供的字符数。
请注意,此特定代码段会一直循环,直到流为空;您可能希望在特定情况下添加另一个退出条件。