如何知道FTP欢迎消息的结束

And*_*ock 8 java sockets ftp inputstream

我的问题是我正在创建一个FTP客户端,到目前为止它的工作完美无缺,除了一个小细节之外,一直困扰着我.我需要知道FTP欢迎消息跨越多少行......这是不可接受的!

    private Socket connection;
    private PrintWriter outStream;
    private Scanner inStream;

public void InitiateConnection() throws IOException 
{
    log.Info(this, "Initiating connection to host: " + host + ":" + port);
    connection = new Socket(host, port);
    log.Info(this, "Connection initiated.");
    outStream = new PrintWriter(connection.getOutputStream(), true);
    inStream = new Scanner(connection.getInputStream());
    Listen();
    Listen();    
    Listen();
}

public String Listen() throws IOException
{
    if(connection == null)
        throw new IOException("Connection not initiated yet");
    String response = inStream.nextLine();
    log.Info(this, "Response: " + response);
    return response;
}
Run Code Online (Sandbox Code Playgroud)

这是简单的设置,我遗漏了所有其他代码,因为它与我的问题没有任何关系.

我尝试了多种尝试来实现这一目标.解决方案1失败:

String response = "";
while(response != null)
    Listen();
Run Code Online (Sandbox Code Playgroud)

解决方案2失败:

while(connection.getInputStream().available > 0)
    Listen();
Run Code Online (Sandbox Code Playgroud)

无数其他......但要么它不起作用,要么方法阻止并等待新的输入.我甚至试过了超时,但这也无法完美地工作,这不是解决这个问题的正确方法......

我需要能够从FTP服务器获取整个欢迎消息,而不知道行数...所以我可以得到这个:

Response:   220-FileZilla Server version 0.9.39 beta
Response:   220-written by Tim Kosse (Tim.Kosse@gmx.de)
Response:   220 Please visit http://sourceforge.net/projects/filezilla/
Run Code Online (Sandbox Code Playgroud)

还有这个:

Response:   220-FileZilla Server version 0.9.40 beta
Response:   220 Welcome to Andrés FTP Server
Run Code Online (Sandbox Code Playgroud)

glg*_*lgl 8

如果仔细查看消息,可以看到除了最后一行之外的所有行都有一个-状态代码.然而,最后一行有一个指示最后一行.

您可以在RFC 959第4.2节中阅读:

因此,多行回复的格式是第一行将以确切的所需回复代码开头,紧接着是连字符," - "(也称为Minus),后跟文本.最后一行将以相同的代码开头,紧接着是Space,可选的是一些文本,以及Telnet的行尾代码.

关于第二到第二行没有任何说法,但它们具有与第一行相同的格式是合乎逻辑的.


更新:FTP协议似乎有严重的文档记录,但我发现另一个引用与我上面相同:

TCP/IP指南中提到,

回复可能包含多行文本.在这种情况下,每行以回复代码开头,除了最后一行之外的所有行在回复代码和回复文本之间都有连字符,以指示回复继续.最后一行在回复代码和回复文本之间有一个空格,就像单行回复一样.此工具通常用于在用户登录后通过230回复代码提供其他响应信息.