【问题标题】:Handling asynchronous responses处理异步响应
【发布时间】:2010-05-23 17:44:17
【问题描述】:

我正在从头开始构建一个 FTP 客户端,我注意到 response codes 不是即时的(这不足为奇)。将相应代码获取到命令的好方法是什么?

以下是 Filezilla 服务器的输出示例。响应码是每行末尾附近的三位数字。

(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> Connected, sending welcome message...
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220-FileZilla Server version 0.9.12 beta
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220-written by Tim Kosse (Tim.Kosse@gmx.de)
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 220 Please visit http://sourceforge.net/projects/filezilla/
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> user anonymous
(000057) 23/05/2010 19:43:10 - (not logged in) (127.0.0.1)> 331 Password required for anonymous

【问题讨论】:

    标签: java asynchronous ftp response


    【解决方案1】:

    在这种特殊情况下,我可能不希望异步实现它。除非发送命令和接收响应代码之间的延迟很大(它可能不适用于 FTP),并且您可以安全地执行另一个命令而不知道最后一个命令的结果(您可能不知道),否则它不是真的值得尝试异步实现。

    我会在发送命令字符串和接收完整响应之间阻止执行,即在伪代码中你可能有一个执行方法,如:

    1. 通过网络发送命令字符串
    2. 使用阻塞网络读取方法或使用非阻塞方法 + Thread.sleep(..) 等待字符返回(或超时,如果您想这样做)
    3. 检查字符是否为“响应结束”标记(换行符?)
    4. 如果不是,则返回2,如果是,则返回完整的响应字符串

    如果你真的决定走异步路线,你应该看看Callback pattern

    希望这会有所帮助。

    【讨论】:

    • 确实如此。我还浏览了 Apache 的 Commons Net。他们使用的是 EventObject 和 EventListener 的组合。对于响应,只要有代码,就会在 InputStreamReader 上调用 readLine(),并将结果行添加到 ArrayList。似乎没有任何异步处理,超时可能由 java.net 类处理。
    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    相关资源
    最近更新 更多