关于java:目录为空时,NLST上的FTP超时

关于java:目录为空时,NLST上的FTP超时

FTP Timeout on NLST when directory is empty

编辑:了解到Webmethods实际上使用NLST,而不是LIST,如果这很重要

我们的企业使用WebMethods集成服务器来处理我们的大部分出站通信,其FTP功能尚有待改进。我们遇到的问题可能是WebMethods特有的,但是如果有人能指出可能导致这种情况的原因,我将不胜感激。

当轮询我们合作伙伴的两个FTP服务器时,我们连接没有问题,但是在空目录(没有文件和子目录)上执行NLST时,它会超时。实际错误是:

com.wm.net.ftpCException: [ISC.0064.9010] java.net.SocketTimeoutException: Accept timed out

它是在调用pub.client.ftp:ls服务期间抛出的。我已经使用多个FTP客户端登录到相同站点,没有问题。我已经在Windows,FileZilla和lftp中使用了默认的FTP客户端。一切都没有问题。据我所知,这些服务器本身不是相同的FTP服务器软件。一个是Microsoft FTP,另一个是我不确定的,但绝对不是Microsoft。

知道在空目录上等待NLST响应时,FTP客户端超时的原因是什么? FTP服务器的可见响应似乎相同,但是NLST对我不知道的空目录的响应方式有所不同吗?

在这两个服务器上,此问题是一致的。在其中包含文件或子目录的目录上,所有功能均正常运行,但在空目录下则不能正常运行。

任何想法或方向将不胜感激。

谢谢!

埃里克·西普尔


我在WebMethods IS版本6.5更新WmPRT_6-5-1_SP1,IS_6-5_SP3中尝试了此操作。

第一次成功。

我在FTP服务器(Debian的默认ftpd)上打开了调试功能。 WebMethods的NLST尊重传递给它的主动/被动参数。

NLST命令没有什么特别之处,也没有在空目录下的正确行为-如果LIST有效,那么RETR,STOR和NLST也应如此。如果NLST使用非空目录,则应使用空目录。

所以我的猜测是:

  • 您的WM版本有我的错误
  • 您的FTP服务器有我的错误
  • 您的系统中有一个古怪的协议感知防火墙,它不喜欢没有数据的FTP数据套接字。

防火墙供应商在FTP方面有点任性...
与其他客户端进行测试时,请确保它来自运行WebMethods Integration Server的同一台计算机。

仅作记录,这是活跃的NLST应该发生的情况

  • 客户端打开一个监听套接字,并发送带有该套接字详细信息的PORT命令
  • 客户端发送NLST命令
  • 服务器连接到客户端的侦听套接字(这是数据套接字)
  • 服务器通过数据套接字传输列表(在这种情况下为零字节)
  • 服务器关闭数据套接字

...并处于被动模式

  • 客户端发送PASV命令
  • 服务器打开一个监听套接字,并用包含其详细信息的PASV响应进行回复
  • 客户端连接到侦听套接字(这是数据套接字)
  • 客户端发送NLST命令
  • 服务器通过数据套接字传输列表(再次为零字节)
  • 服务器关闭数据套接字

Guillermo Vasconcelos的回答正确。有两种FTP模式,主动模式和被动模式。默认的FTP模式是活动的。活动服务器要求服务器通过某些TCP / IP端口连接回客户端。这不适用于防火墙,因为可能会阻塞此端口,或者如果您位于带有NAT(未映射)的路由器后面。

如果改用被动(PASV)模式,则不应挂起。


我不确定这是否是相同的问题,但是不久前我在Java(commons.net)中使用另一个FTP客户端时也遇到了类似的症状。原来是由连接的主动/被动模式引起的。
很抱歉,我无法为您提供更多详细信息,仅此而已...希望能有所帮助。


FTP要求通过防火墙同时打开指定的端口和该端口上的端口。当我遇到webMethods超时问题时,这是因为防火墙没有打开返回端口。

霍华德


我明天将在此处进行维护时运行一些将设置设为被动的新测试,但是我不确定这是问题所在。如果该目录中有文件或子目录,我们就能获得目录列表。仅当我们要进行NLST操作的目录为空时,它才会失败。

主动/被动差异只会在空目录中体现出来,还是存在另一种可能性?


推荐阅读