Apache Commons FTPClient.storeFile() 错误由以下原因引起:java.net.SocketException:连接重置
Apache Commons FTPClient.storeFile() error Caused by: java.net.SocketException: Connection reset
我进行了新的编辑 (2),问题似乎是图像实际上正在存储,但有时存储它们需要一段时间(很多分钟,通常需要大约一秒钟)。我很好奇这是否是我的服务器?我发现很奇怪我 运行 这个时候没有问题(很多个月前我一直在做另一个项目),所以我很好奇为什么现在有问题,所以服务器端可能有意义,但是如果是这样,那现在是个大问题...
我有一个连接到我的服务器并将 files/images 保存到服务器的应用程序。我本来把文件保存在我的电脑上,然后上传了那些文件;但是,由于我不想保存文件,所以我选择了使用 ByteArrayOutputStream 的方式。
出于某种原因,运行在我的文件上传过程中,我的 JavaFX 应用程序经常会挂起。
单击 x 时,它会询问我是否要尝试 "restore" 应用程序,当我尝试时,它会抛出错误的堆栈跟踪。
Caused by: java.net.SocketException: Connection reset
我在此处和 Google 上搜索了多个 post,但没有任何帮助。
到目前为止我已经尝试过了。
- "ftp.enterLocalPassiveMode(已启用)。
- 更改超时,例如连接和数据。
- Java 7 中的一些错误,您必须 运行 命令行脚本才能修复(我正在 运行ning Java 8 更新 71 ).
- 一些似乎只对 FTPSClient 有用的 exec 命令,对 FTPClient
没有用
还有一些东西告诉我增加缓冲区大小,用户做了“setBufferSize(1024*1024)”,而对我来说默认是 0...仍然没有改变任何东西。
到目前为止没有任何效果,奇怪的是它会上传 运行dom 数量的图像,然后挂起。我一直注意到,我尝试上传这些图片的次数越多,在挂起之前似乎上传的越多,但有一次它挂在第一张图片上,所以我不知道...
我 运行 Netbeans Profiler,我不确定 "Thread Dump" 中是否显示了任何异常内容,但如果需要,我可以 post。
我的代码,如果重要的话。
for(Data f: plan.getData())
{
BufferedImage b = image; //reduced code here
os = new ByteArrayOutputStream();
ImageIO.write(b, "PNG", os);
is = new ByteArrayInputStream(os.toByteArray());
ftp.storeFile(f.getName(), is); // Application hangs/ Connection Resets here after x amount of stores.
}
FTP 连接:
{
ftp.setDefaultTimeout(100000000);
ftp.connect();
ftp.login();
// use local passive mode to pass firewall
ftp.enterLocalPassiveMode();
//System.out.print(ftp.getReplyString());
//keeps connection alive (doesn't really work)
//Tried to set as many timeouts as I could as I read some of these could be the issue too...
ftp.setKeepAlive(true);
ftp.setControlKeepAliveTimeout(100000);
ftp.setControlKeepAliveReplyTimeout(10000);
ftp.setConnectTimeout(100000);
ftp.setDataTimeout(300);
ftp.setSoTimeout(100000);
//sets buffer size to allow more files to be transferred.
System.out.println("Buffer Size:" + ftp.getBufferSize());
ftp.setBufferSize(1024 * 1024);
System.out.println("Buffer Size:" + ftp.getBufferSize());
}
此外,在关闭程序后,我在控制台中以红色字母显示了行
Java Result: -805306369
我在 Google 上找不到这个结果编号,也不知道是否有特定的地方可以查找结果。
如果有人有任何建议,我将不胜感激...
这真的很困扰我,尤其是因为我之前存储带有图像的文件完全没有问题....
感谢任何帮助,谢谢!
堆栈跟踪:
SEVERE: null
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.read(BufferedReader.java:182)
at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:314)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
at org.apache.commons.net.ftp.FTP.getReply(FTP.java:694)
at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1830)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:689)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:639)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1996)
编辑:我尝试更改为仅读取文件,这是我第一次做的,但我遇到了同样的错误。
我稍微修改了我的代码,把它放在了不同的地方,但本质上都是一样的...
ONLY这2个版本之间的变化,除了很多时间,就是我换了电脑...这是一个JavaFX应用,所以我不要认为我在我的旧计算机上对 Tomcat 所做的更改会很重要,但我会看看我的旧计算机是否会导致此问题....
EDIT2:我检查了旧计算机,它使用相同版本的 Apache-Commons-Net (3.4) 但我无法 运行 应用程序处于以前的状态,所以我会看看是否我可以修复它,或者尝试其他选项。
为了它的价值,我决定不单击 "x" 退出,或根本不触摸该应用程序,而只是观察输出。
通常情况下,它会向服务器存储一些文件,然后崩溃,但后来我意识到我的应用程序一直在 "hangs",如果我真的等了一会儿,它会存储其他 images/files.
所以现在我很困惑这里的问题到底是什么。是我的服务器有问题,还是我这边有问题?如果 images/content 有时被快速保存(当我做秒表时每张图像大约 1 秒),但其他时候需要几分钟或更长时间,我会认为这更多是服务器的错。我将尝试获取完整的 StopWatch 堆栈跟踪以查看发生了什么。
似乎先 "thread.sleep(x)" 或 ftp 断开连接,然后再连接有时有助于更轻松地移动文件存储。不确定这是否只是运气,或者这是否在某种程度上有所帮助....
要尝试的事情:
a.) 每次上传后关闭 ftp 客户端,然后在开始下一次上传之前重新打开 ftp 客户端。这可能会避免任何类型的服务器超时或网络超时。我知道这是低效的,但服务器和网络可以内置超时。
b.) 尝试使用缓冲输出流到服务器(如果数据或 Apache FTPClient 尚未这样做)。缓冲输入流很好,但尝试 "write" 到服务器时会发生网络延迟。
在Apache Commons Net 3.4 ApisetControlKeepAliveTimeout方法说明如下:
Set the time to wait between sending control connection keepalive
messages when processing file upload or download.
所以,如果你想保持连接有效,你应该尝试减少控制消息之间的等待时间。
在API定义中再次说明,此功能仅在以下方法中启用:
- retrieveFile(String, OutputStream)
- appendFile(String, InputStream)
- storeFile(String, InputStream)
- storeUniqueFile(InputStream)
- storeUniqueFileStream(String)
而不是
retrieveFileStream(String) , storeFileStream(String) and the other
xxxFileStream methods.
最后注意:要上传字节图像文件,您还应该设置文件类型和传输模式,如下所示:
ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);
希望这对您有所帮助。
这个答案可能会对那些与我有类似程序的人有所帮助。
基本上,我必须在我的反病毒应用程序中允许正确的权限才能存储文件。这很奇怪,因为正如我之前所说,这在我的旧计算机上有效,并且旧计算机具有相同的保护...
我尝试了什么:
我尝试更改我的代码中的设置,但没有任何效果,有些会很快导致超时。 这导致我尝试使用 FTPClient 和其他服务器,认为这是我的服务器
我试图在另一台计算机上连接到 2 个不同的服务器,但也遇到了一些问题。 这让我尝试通过我的代码连接到第二个服务器
在我的代码中的第二个服务器出现问题后,我意识到它必须是我这边的东西(奇怪的是 server1 每次挂起都会挂起 15 分钟,但 server2 会每次有 10 分钟.... 这让我尝试了我的 Anti-Virus
我试图暂停对我的 AV 的保护,以及完全关闭 AV 程序,每个都给了我不同的错误。 这促使我寻找 Windows 防火墙,看看那里是否存在问题
Windows 防火墙打开,关闭它,然后再次尝试 4 中的步骤,我即将让它工作。
我不确定 Windows 防火墙是否需要启动,因为我的 AV 有另一个防火墙,我发现 Windows 防火墙导致问题很奇怪,看起来"Outbound" 默认情况下允许数据包....
概率......
1) 有时您会更改 ftp.config 文件中的侦听路径,因为您会遇到连接重置问题。
2) 在尝试之前 Java API 你可以手动操作并检查日志你会清楚的。
我进行了新的编辑 (2),问题似乎是图像实际上正在存储,但有时存储它们需要一段时间(很多分钟,通常需要大约一秒钟)。我很好奇这是否是我的服务器?我发现很奇怪我 运行 这个时候没有问题(很多个月前我一直在做另一个项目),所以我很好奇为什么现在有问题,所以服务器端可能有意义,但是如果是这样,那现在是个大问题...
我有一个连接到我的服务器并将 files/images 保存到服务器的应用程序。我本来把文件保存在我的电脑上,然后上传了那些文件;但是,由于我不想保存文件,所以我选择了使用 ByteArrayOutputStream 的方式。
出于某种原因,运行在我的文件上传过程中,我的 JavaFX 应用程序经常会挂起。
单击 x 时,它会询问我是否要尝试 "restore" 应用程序,当我尝试时,它会抛出错误的堆栈跟踪。
Caused by: java.net.SocketException: Connection reset
我在此处和 Google 上搜索了多个 post,但没有任何帮助。
到目前为止我已经尝试过了。
- "ftp.enterLocalPassiveMode(已启用)。
- 更改超时,例如连接和数据。
- Java 7 中的一些错误,您必须 运行 命令行脚本才能修复(我正在 运行ning Java 8 更新 71 ).
- 一些似乎只对 FTPSClient 有用的 exec 命令,对 FTPClient 没有用
还有一些东西告诉我增加缓冲区大小,用户做了“setBufferSize(1024*1024)”,而对我来说默认是 0...仍然没有改变任何东西。
到目前为止没有任何效果,奇怪的是它会上传 运行dom 数量的图像,然后挂起。我一直注意到,我尝试上传这些图片的次数越多,在挂起之前似乎上传的越多,但有一次它挂在第一张图片上,所以我不知道...
我 运行 Netbeans Profiler,我不确定 "Thread Dump" 中是否显示了任何异常内容,但如果需要,我可以 post。
我的代码,如果重要的话。
for(Data f: plan.getData())
{
BufferedImage b = image; //reduced code here
os = new ByteArrayOutputStream();
ImageIO.write(b, "PNG", os);
is = new ByteArrayInputStream(os.toByteArray());
ftp.storeFile(f.getName(), is); // Application hangs/ Connection Resets here after x amount of stores.
}
FTP 连接:
{
ftp.setDefaultTimeout(100000000);
ftp.connect();
ftp.login();
// use local passive mode to pass firewall
ftp.enterLocalPassiveMode();
//System.out.print(ftp.getReplyString());
//keeps connection alive (doesn't really work)
//Tried to set as many timeouts as I could as I read some of these could be the issue too...
ftp.setKeepAlive(true);
ftp.setControlKeepAliveTimeout(100000);
ftp.setControlKeepAliveReplyTimeout(10000);
ftp.setConnectTimeout(100000);
ftp.setDataTimeout(300);
ftp.setSoTimeout(100000);
//sets buffer size to allow more files to be transferred.
System.out.println("Buffer Size:" + ftp.getBufferSize());
ftp.setBufferSize(1024 * 1024);
System.out.println("Buffer Size:" + ftp.getBufferSize());
}
此外,在关闭程序后,我在控制台中以红色字母显示了行
Java Result: -805306369
我在 Google 上找不到这个结果编号,也不知道是否有特定的地方可以查找结果。
如果有人有任何建议,我将不胜感激...
这真的很困扰我,尤其是因为我之前存储带有图像的文件完全没有问题....
感谢任何帮助,谢谢!
堆栈跟踪:
SEVERE: null
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.read(BufferedReader.java:182)
at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:314)
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
at org.apache.commons.net.ftp.FTP.getReply(FTP.java:694)
at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1830)
at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:689)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:639)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1996)
编辑:我尝试更改为仅读取文件,这是我第一次做的,但我遇到了同样的错误。
我稍微修改了我的代码,把它放在了不同的地方,但本质上都是一样的...
ONLY这2个版本之间的变化,除了很多时间,就是我换了电脑...这是一个JavaFX应用,所以我不要认为我在我的旧计算机上对 Tomcat 所做的更改会很重要,但我会看看我的旧计算机是否会导致此问题....
EDIT2:我检查了旧计算机,它使用相同版本的 Apache-Commons-Net (3.4) 但我无法 运行 应用程序处于以前的状态,所以我会看看是否我可以修复它,或者尝试其他选项。
为了它的价值,我决定不单击 "x" 退出,或根本不触摸该应用程序,而只是观察输出。
通常情况下,它会向服务器存储一些文件,然后崩溃,但后来我意识到我的应用程序一直在 "hangs",如果我真的等了一会儿,它会存储其他 images/files.
所以现在我很困惑这里的问题到底是什么。是我的服务器有问题,还是我这边有问题?如果 images/content 有时被快速保存(当我做秒表时每张图像大约 1 秒),但其他时候需要几分钟或更长时间,我会认为这更多是服务器的错。我将尝试获取完整的 StopWatch 堆栈跟踪以查看发生了什么。
似乎先 "thread.sleep(x)" 或 ftp 断开连接,然后再连接有时有助于更轻松地移动文件存储。不确定这是否只是运气,或者这是否在某种程度上有所帮助....
要尝试的事情:
a.) 每次上传后关闭 ftp 客户端,然后在开始下一次上传之前重新打开 ftp 客户端。这可能会避免任何类型的服务器超时或网络超时。我知道这是低效的,但服务器和网络可以内置超时。
b.) 尝试使用缓冲输出流到服务器(如果数据或 Apache FTPClient 尚未这样做)。缓冲输入流很好,但尝试 "write" 到服务器时会发生网络延迟。
在Apache Commons Net 3.4 ApisetControlKeepAliveTimeout方法说明如下:
Set the time to wait between sending control connection keepalive messages when processing file upload or download.
所以,如果你想保持连接有效,你应该尝试减少控制消息之间的等待时间。
在API定义中再次说明,此功能仅在以下方法中启用:
- retrieveFile(String, OutputStream)
- appendFile(String, InputStream)
- storeFile(String, InputStream)
- storeUniqueFile(InputStream)
- storeUniqueFileStream(String)
而不是
retrieveFileStream(String) , storeFileStream(String) and the other xxxFileStream methods.
最后注意:要上传字节图像文件,您还应该设置文件类型和传输模式,如下所示:
ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);
希望这对您有所帮助。
这个答案可能会对那些与我有类似程序的人有所帮助。
基本上,我必须在我的反病毒应用程序中允许正确的权限才能存储文件。这很奇怪,因为正如我之前所说,这在我的旧计算机上有效,并且旧计算机具有相同的保护...
我尝试了什么:
我尝试更改我的代码中的设置,但没有任何效果,有些会很快导致超时。 这导致我尝试使用 FTPClient 和其他服务器,认为这是我的服务器
我试图在另一台计算机上连接到 2 个不同的服务器,但也遇到了一些问题。 这让我尝试通过我的代码连接到第二个服务器
在我的代码中的第二个服务器出现问题后,我意识到它必须是我这边的东西(奇怪的是 server1 每次挂起都会挂起 15 分钟,但 server2 会每次有 10 分钟.... 这让我尝试了我的 Anti-Virus
我试图暂停对我的 AV 的保护,以及完全关闭 AV 程序,每个都给了我不同的错误。 这促使我寻找 Windows 防火墙,看看那里是否存在问题
Windows 防火墙打开,关闭它,然后再次尝试 4 中的步骤,我即将让它工作。
我不确定 Windows 防火墙是否需要启动,因为我的 AV 有另一个防火墙,我发现 Windows 防火墙导致问题很奇怪,看起来"Outbound" 默认情况下允许数据包....
概率......
1) 有时您会更改 ftp.config 文件中的侦听路径,因为您会遇到连接重置问题。
2) 在尝试之前 Java API 你可以手动操作并检查日志你会清楚的。