java - Apache Commons FTPClient.storeFile()错误原因:java.net.SocketException:连接重置

标签 java sockets ftp connection apache-commons-net

我做了一个新的编辑(2),看来问题是实际上是在存储图像,但有时需要一段时间才能存储它们(很多分钟,通常大约需要一秒钟)。我很好奇,也许是我的服务器吗?我觉得很奇怪,我运行该程序时没问题(很多个月前,我一直在从事另一个项目),所以我很好奇为什么现在有问题,所以服务器端可以理解,但这是一个大问题现在如果是这样...



我有一个连接到服务器并将文件/图像保存到服务器的应用程序。我最初将文件保存在计算机上,然后上传了这些文件。但是,由于我不想保存文件,因此我选择了使用ByteArrayOutputStream的方法。

由于某种原因,在我的文件上传过程中,我的JavaFX应用程序会随机挂起。

单击x时,它询问我是否要尝试并“还原”该应用程序,当我执行该操作时,它将引发带有错误的堆栈跟踪。


  由:java.net.SocketException:连接重置


我在这里和Google上搜索了多个帖子,没有任何帮助。

到目前为止,我已经尝试过了。


“ ftp.enterLocalPassiveMode(已启用)。
更改超时,例如连接和数据。
Java 7中的一些错误,您必须运行命令行脚本才能修复(我正在运行Java 8 Update 71)。
一些似乎只对FTPSClient有用的exec命令,而不对FTPClient有用


还有些事情告诉我要增加缓冲区大小,并且用户执行了“ setBufferSize(1024 * 1024),而对我而言,默认值为0 ...仍然没有进行任何更改。

到目前为止,什么都没有用,而且奇怪的是它将上传随机数量的图像,然后挂起。我一直注意到,我尝试上传这些图像的次数越多,在挂起之前似乎上传的图像越多,但是一旦它挂在第一张图像上,那么我就不知道...

我运行了Netbeans Profiler,但不确定“线程转储”中是否显示了常规以外的任何内容,但是我可以在需要时发布。



我的代码,如果有关系。

   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结果:-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)




编辑:我试图做一个更改,只是读取文件,这是我第一次,并且我遇到相同的错误。

我稍微修改了代码,然后将其放在不同的位置,但是基本上所有内容都是相同的...

这两个版本之间唯一的变化是,除了很多时间以外,我还切换了计算机。这是一个JavaFX应用程序,因此我认为我对旧计算机上的Tomcat所做的更改并不重要,但是我我要看我的旧电脑是否引起了这个问题。



EDIT2:我检查了旧计算机,它使用的是相同版本的Apache-Commons-Net(3.4),但是我无法在以前的状态下运行该应用程序,因此我将查看是否可以对其进行修复,或尝试其他选择。

为了我的价值,我决定不单击“ x”退出,或者根本不触摸应用程序,而只是看着输出。

通常,它将一些文件存储到服务器,然后崩溃,但是随后我意识到我的应用程序始终“挂起”,并且如果我实际上等待一会儿,它将存储其他图像/文件。

所以现在我很困惑这里的问题是什么。是我的服务器出了问题,还是我的东西?如果有时快速保存图像/内容(当我执行StopWatch时,每个图像大约1秒),则我认为这更多是服务器的故障。我将尝试获取完整的StopWatch堆栈跟踪,以查看发生了什么。

似乎也可以执行“ thread.sleep(x)”或ftp断开连接,然后再进行连接,这有时会有助于使文件存储更容易。不知道这是不是只是运气,还是以某种方式帮助了...。

最佳答案

Apache Commons Net 3.4 Api中,setControlKeepAliveTimeout方法描述如下:


  设置发送控制连接保持活动之间的等待时间
  在处理文件上载或下载时出现错误消息。


因此,如果要保持连接活动,则应尝试减少控制消息之间的等待时间。

再次在API定义中声明,此功能仅在以下方法中启用:


  
  resolveFile(String,OutputStream)
  appendFile(String,InputStream)
  storeFile(String,InputStream)
  storeUniqueFile(InputStream)
  storeUniqueFileStream(字符串)
  


而不是


  resolveFileStream(String),storeFileStream(String)和其他
  xxxFileStream方法。


最后说明:要上传字节图像文件,您还应该如下设置文件类型和传输模式:

ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);


希望这可以帮助。

关于java - Apache Commons FTPClient.storeFile()错误原因:java.net.SocketException:连接重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36024911/

相关文章:

java - ListView 和 fragment

java - 如何在 Android 上接收多播消息?

python - 在python中通过modbus写入(更新值)到寄存器

python - 尝试使用 ftplib 和 storbinary 存储 png 图像 ==> UnicodeEncodeError

c# - 我正在尝试获得 ftp 下载文件的速度,但有时我变得无穷大,为什么?

java - 如何在数据库连接中正确使用try-with-resources?

java - 限制用户输入空格键

java - volatile 解决的行为称为什么?

PHP 流写入缓冲区

java - 用Java写入ftp服务器上的文本文件