如标题描述的那样,借用同事的工具类,用来上传文件到FTP上面。我在连接FTP服务器上传文件时报错,为什么要标明时上传呢,请看报错:
注意红框区域,可以明显知道,我是成功连接到FTP服务器上的,而且切换目录成功了。但上传文件时却报错连接超时?问题在哪里?
我用的依赖:
<dependency>
<groupId>commons-netgroupId>
<artifactId>commons-netartifactId>
<version>1.4.1version>
dependency>
网上有人说是防火墙未关闭,可我的没开过
服务器上是关的?也不可能啊。同事访问是正常的。
这就更不可能了
有人说进入被动模式的位置应该要在连接之前,如果你点开enterLocalPassiveMode方法,你就知道这是不对的了。至少不是我这个问题的解决方案。
就是简单设置了三个值而已
还是断点打起来,从报错开始看
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)
断点调试进去,从下向上看一下
第一个是实际调用的存储方法 如下
再点进去定位到这里,这里就是与服务器建立数据连接
再进去 ,定位给到以下代码段,该段代码的作用是,以被动模式创建本机与服务器端的套接字连接
到这里已经就感觉到有点不对了,为什么创建连接会不对呢
再进去 看到以下代码
这里问题就很明显了,创建套接字出错。问题是为什么出错,检查下参数,端口也没被占用啊。。。
然后叫来同事跟我一起断点调试。。。
跟同事比对之后 发现是依赖版本的不对。。。下次借别人的工具类,一定要看清楚对应的依赖和版本。。。他用的是。。。
<dependency>
<groupId>commons-netgroupId>
<artifactId>commons-netartifactId>
<version>3.3version>
dependency>