我正在使用apache commons net FTPSClient连接到本地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不是一个选项。
此时(由于套接字状态)我已经排除了防火墙问题,但我不知道可能导致挂起的问题。我认为它是服务器端,我可以与运行它的人交谈,但如果我能告诉他们在哪里看它会有所帮助。
更新
如果问题被低估或投票结束,我将不胜感激。在我看来,这是一个完美的stackoverflow问题。
答案 0 :(得分:2)
使用FTPS,您必须使用PROT P为未受保护的数据通道制作数据通道TLS或PROT C.它可能会挂起,因为客户端和服务器不同意信道的保护,例如当服务器等待来自客户端的TLS客户端Hello开始加密时,客户端等待来自服务器的非加密数据。因此,请检查您的通信中的“PROT”命令及其回复。
如果FTP服务器位于路由器或防火墙后面,则可能存在其他问题。当客户端位于防火墙后面时使用PASV模式,但如果服务器位于哑防火墙或NAT后面,则会出现问题。尝试普通(例如非TLS)FTP工作。