【问题标题】:FTP connection inputstream hangsFTP 连接输入流挂起
【发布时间】:2014-01-24 07:42:08
【问题描述】:

我正在使用 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 被创建并且 socket.isBound() 返回 true,socket.isConnected() 而 socket.isInputShutDown() 返回 false。一切似乎都很好,直到 ftp 客户端实际尝试从输入流中读取,这会无限期地挂起,没有任何数据即将到来。由于使用 SSL,Wireshark 不是一个选项。

此时(由于套接字状态)我已经排除了防火墙问题,但我不知道可能导致挂起的原因。我假设它是服务器端的,我可以与运行它的人交谈,但如果我能告诉他们在哪里看会很有帮助。

更新

如果该问题被否决或投票赞成,我将不胜感激......在我看来,这似乎是一个完美的 stackoverflow 问题。

【问题讨论】:

  • 呃,问题中的链接...?
  • 那不是你的代码……那是你使用的 FTPClient 的代码
  • 呃,当 FTPClient 尝试从套接字创建的输入流中读取时,它正在挂起......

标签: java ftp apache-commons-net


【解决方案1】:

对于 FTPS,您必须使用 PROT P 使数据通道 TLS 或 PROTC 用于未受保护的数据通道。它可能会挂起,因为客户端和服务器不同意通道的保护,例如客户端等待来自服务器的未加密数据,而服务器等待来自客户端的 TLS Client Hello 以开始加密。因此,请检查您的通信中是否有“PROT”命令及其回复。

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

【讨论】:

  • 问题确实与缺少握手有关。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-09-12
  • 2013-09-24
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多