2014-01-24 50 views
1

我使用apache commons net FTPSClient连接到本地ftp(被动模式)。连接似乎挂起后FTP连接输入流挂起

> LIST 
< 150 Opening ASCII mode data connection for /bin/ls. 

我已经添加了一些日志记录到FTPClient类,看看它究竟在哪里挂起。它是用这种方法:http://grepcode.com/file/repo1.maven.org/maven2/commons-net/commons-net/3.3/org/apache/commons/net/ftp/FTPClient.java#FTPClient.initiateListParsing%28org.apache.commons.net.ftp.FTPFileEntryParser%2Cjava.lang.String%29

套接字被创建并且socket.isBound()返回true,如同socket.isConnected(),而socket.isInputShutDown()返回false。所有这一切似乎都很好,直到ftp客户端实际尝试从输入流中读取数据,这会在没有任何数据即将出现的情况下无限期地挂起。由于使用SSL,Wireshark不是一个选项。

在这一点上(由于套接字状态),我排除了防火墙的问题,但我不知道可能会导致挂起。我认为这是服务器端,我可以与运行它的人交谈,但如果我能告诉他们在哪里寻找,这将是有帮助的。

UPDATE

如果问题是downvoted或投票接近我会非常感激的解释......在我看来,是一个完美的计算器问题。

+0

你的代码在哪里? –

+0

恩,问题中的链接......? – nablex

+0

那不是你的代码...那就是你使用的FTPClient的代码 –

回答

2

使用FTPS,您必须使用PROT P为非保护数据通道制作数据通道TLS或PROT C。它可能会挂起,因为客户端和服务器不同意通道的保护,例如当服务器等待来自客户端的TLS客户端Hello开始加密时,客户端等待来自服务器的非加密数据。所以请检查您的通信是否有“PROT”命令及其答复。

如果FTP服务器位于路由器或防火墙之后,可能会出现其他问题。客户端位于防火墙后面时使用PASV模式,但如果服务器位于哑防火墙或NAT后面,则会出现问题。尝试使用纯文本(例如非TLS)FTP。

+0

这个问题确实与丢失的握手有关。非常感谢! – nablex