Java连接FTP服务器上传文件报错

  • 问题描述
  • 问题排查
  • 防火墙未关闭?
  • 没进入被动模式?
  • 断点调试
  • 解决


问题描述

如标题描述的那样,借用同事的工具类,用来上传文件到FTP上面。我在连接FTP服务器上传文件时报错,为什么要标明时上传呢,请看报错:

java Ftp 连接测试 java连接ftp被拒绝_服务器


注意红框区域,可以明显知道,我是成功连接到FTP服务器上的,而且切换目录成功了。但上传文件时却报错连接超时?问题在哪里?

我用的依赖:

<dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>1.4.1</version>
        </dependency>

问题排查

防火墙未关闭?

网上有人说是防火墙未关闭,可我的没开过

java Ftp 连接测试 java连接ftp被拒绝_java Ftp 连接测试_02


服务器上是关的?也不可能啊。同事访问是正常的。

没进入被动模式?

这就更不可能了

java Ftp 连接测试 java连接ftp被拒绝_java Ftp 连接测试_03


有人说进入被动模式的位置应该要在连接之前,如果你点开enterLocalPassiveMode方法,你就知道这是不对的了。至少不是我这个问题的解决方案。

java Ftp 连接测试 java连接ftp被拒绝_java_04


就是简单设置了三个值而已

断点调试

还是断点打起来,从报错开始看

java.net.ConnectException: Connection timed out: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at java.net.Socket.connect(Socket.java:538)
	at java.net.Socket.<init>(Socket.java:434)
	at java.net.Socket.<init>(Socket.java:211)
	at org.apache.commons.net.DefaultSocketFactory.createSocket(DefaultSocketFactory.java:53)
	at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:513)
	at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:388)
	at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1388)

简化一下,看到出错的问题是在这里。

DefaultSocketFactory.createSocket(DefaultSocketFactory.java:53)
FTPClient._openDataConnection_(FTPClient.java:513)
FTPClient.__storeFile(FTPClient.java:388)
FTPClient.storeFile(FTPClient.java:1388)

断点调试进去,从下向上看一下

第一个是实际调用的存储方法 如下

java Ftp 连接测试 java连接ftp被拒绝_服务器_05


再点进去定位到这里,这里就是与服务器建立数据连接

java Ftp 连接测试 java连接ftp被拒绝_.net_06


再进去 ,定位给到以下代码段,该段代码的作用是,以被动模式创建本机与服务器端的套接字连接

java Ftp 连接测试 java连接ftp被拒绝_java Ftp 连接测试_07


到这里已经就感觉到有点不对了,为什么创建连接会不对呢

再进去 看到以下代码

java Ftp 连接测试 java连接ftp被拒绝_java Ftp 连接测试_08


这里问题就很明显了,创建套接字出错。问题是为什么出错,检查下参数,端口也没被占用啊。。。

java Ftp 连接测试 java连接ftp被拒绝_java Ftp 连接测试_09


然后叫来同事跟我一起断点调试。。。

解决

跟同事比对之后 发现是依赖版本的不对。。。下次借别人的工具类,一定要看清楚对应的依赖和版本。。。他用的是。。。

<dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.3</version>
        </dependency>