Apache Commons FTPClient.storeFile()错误引起:java.net.SocketException:连接重置

时间:2016-03-16 00:45:08

标签: java sockets ftp connection apache-commons-net

我做了一个新的编辑(2),似乎问题是图像实际上是存储的,但有时需要一段时间来存储它们(很多分钟,通常需要大约一秒钟)。我很好奇,如果它可能是我的服务器?我觉得奇怪的是,当我运行这个时没有问题(很多个月以前,我一直在研究另一个项目),所以我很好奇为什么现在有问题,所以服务器端可能有意义,但这是一个大问题现在如果......

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

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

单击x时会询问我是否要尝试“还原”应用程序,当我这样做时会抛出错误的堆栈跟踪。

  

引起:java.net.SocketException:连接重置

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

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

  1. “ftp.enterLocalPassiveMode(已启用)。
  2. 更改超时,例如“连接和数据”。
  3. Java 7中的一些错误,您必须运行命令行脚本才能修复(我正在运行Java 8 Update 71)。
  4. 一些exec命令似乎只对FTPSClient有用,而不是FTPClient
  5. 还有一些东西告诉我增加缓冲区大小并且用户执行了“setBufferSize(1024 * 1024)”,而默认情况下,对我来说是0 ...仍然没有改变任何东西。

    到目前为止,没有任何工作,奇怪的是它将上传随机数量的图像,然后挂起。我一直在注意到,我尝试上传这些图片的次数越多,他们似乎上传的越多,在挂起之前,但有一次它挂在第一张图片上,所以我不知道......

    我运行Netbeans Profiler并且我不确定“线程转储”中是否显示了oridinary中的任何内容,但如果需要,我可以发布。

    我的代码是否重要。

       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)
    

    编辑:我试图改变只是阅读文件,这是我第一次做的,我得到了同样的错误。

    我把代码改了一些,把它放在不同的地方,但一切都基本相同......

    ONLY 除了很多时候,这两个版本之间的变化是我切换了计算机......这是一个JavaFX应用程序,所以我不认为我对Tomcat所做的更改在我的旧电脑上很重要,但我会看看我的旧电脑是否会导致这个问题......

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

    为了什么值得我决定不点击“x”退出,或者完全触摸应用程序,只是看了输出。

    通常,它会将几个文件存储到服务器,然后崩溃,但后来我意识到我的应用程序“挂起”整个时间,如果我实际等待一段时间,它将存储其他图像/文件。 / p>

    所以现在我很困惑这里的问题是什么。这是我的服务器有问题,还是我的问题?我认为这更像是服务器的错误,如果图像/内容有时被快速保存(当我做一个秒表时每张图像约1秒),但有时需要几分钟或更长时间。我将尝试获取完整的StopWatch堆栈跟踪以查看正在发生的事情。

    似乎做“thread.sleep(x)”或ftp断开连接,然后连接有时会帮助更轻松地移动文件存储。不确定这只是运气,还是以某种方式帮助......

4 个答案:

答案 0 :(得分:2)

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

  

设置发送控制连接keepalive之间的等待时间   处理文件上传或下载时的消息。

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

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

  
      
  • retrieveFile(String,OutputStream)
  •   
  • appendFile(String,InputStream)
  •   
  • storeFile(String,InputStream)
  •   
  • storeUniqueFile(InputStream的)
  •   
  • storeUniqueFileStream(字符串)
  •   

而不是

  

retrieveFileStream(String),storeFileStream(String)和另一个   xxxFileStream方法。

最后注意:要上传字节图像文件,您还应按如下方式设置文件类型和传输模式:

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

希望这有帮助。

答案 1 :(得分:2)

这个答案可能会帮助那些有类似程序的人。

基本上我必须在我的防病毒应用程序中允许正确的权限才能允许存储文件。这很奇怪,因为正如我之前所说,这可以在我的旧电脑上运行,而旧电脑也有同样的保护......

我尝试了什么:

  1. 我尝试更改代码中的设置,没有任何效果,有些会导致超时。 这导致我尝试使用FTPClient和其他服务器,认为这是我的服务器

  2. 我尝试连接到另一台计算机上的两台不同的服务器,并且还有一些问题。 这导致我尝试通过我的代码连接到第二台服务器

  3. 在我的代码中遇到第二台服务器的问题之后,我意识到它必须是我的终点(奇怪的是,server1将挂起15分钟,每次挂起,但server2将持续10分钟每次.... 这导致我尝试我的反病毒

  4. 我试图暂停我的AV保护,以及完全关闭AV程序,每个都给了我一个不同的错误。 这导致我找到Windows防火墙以查看是否存在问题

  5. Windows防火墙已启用,通过关闭它,再次尝试4中的步骤,我即将开始工作。

  6. 我不确定Windows防火墙是否需要启动,因为我的AV上有另一个防火墙,我发现Windows防火墙导致问题很奇怪,因为所有" Outbound"默认情况下允许数据包....

答案 2 :(得分:2)

概率.....

1)有时你会在ftp.config文件中对listen路径进行更改,因为你会遇到连接重置问题。

2)在尝试使用Java API之前,您可以手动执行并检查日志,这样您就可以清楚地了解它。

答案 3 :(得分:1)

要尝试的事情:

a。)每次上传后关闭ftp客户端,然后在开始下一次上传之前重新打开ftp客户端。这可能会避免任何类型的服务器超时或网络超时。我知道这是低效的,但服务器和网络可以内置超时。

b。)尝试使用缓冲输出流到服务器(如果Data或Apache FTPClient尚未这样做)。缓冲输入流很好,但尝试“写入”服务器时会发生网络延迟。