zoukankan      html  css  js  c++  java
  • FTP上传文件,报错java.net.SocketException: Software caused connection abort: recv failed

    FTP上传功能,使用之前写的代码,一直上传都没有问题,今天突然报这个错误:

    java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:152)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:154)
    at java.io.BufferedReader.read(BufferedReader.java:175)
    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.sendCommand(FTP.java:483)
    at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:608)
    at org.apache.commons.net.ftp.FTP.port(FTP.java:932)
    at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:812)
    at org.apache.commons.net.ftp.FTPClient._storeFile(FTPClient.java:633)
    at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:624)
    at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1976)
    at cn.com.fp.util.ftp.FavFTPUtil.uploadFile(FavFTPUtil.java:62)
    at cn.com.fp.util.ftp.FavFTPUtil.uploadFileFromProduction(FavFTPUtil.java:139)
    at cn.com.fp.util.ftp.FavFTPUtil.main(FavFTPUtil.java:363)

    因为之前遇到过,都是流的非正常关闭导致的,我关闭所有进程,MyEclipse重启,项目重启,仍然报这个错误,又重启电脑,仍然存在;意识到必须找到原因所在,否则都是做一些无用功。

    上网找了一些博客,才发现问题根源,客户提供的服务器是Linux,而我的代码是在Windows 10下运行的,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上或者其他服务器上面,由于安全限制,可能某些端口没有开启,所以就出现阻塞,也就是感到代码运行特别慢、受阻的原因,如何解决呢?如下:

    添加FTPClient.enterLocalPassiveMode();这行代码,即每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。

    代码Demo如下:

          /**
    	 * 上传文件(可供Action/Controller层使用)
    	 * 
    	 * @param hostname
    	 *            FTP服务器地址
    	 * @param port
    	 *            FTP服务器端口号
    	 * @param username
    	 *            FTP登录帐号
    	 * @param password
    	 *            FTP登录密码
    	 * @param pathname
    	 *            FTP服务器保存目录
    	 * @param fileName
    	 *            上传到FTP服务器后的文件名称
    	 * @param inputStream
    	 *            输入文件流
    	 * @return
    	 */
    	public static boolean uploadFile(String hostname, int port,
    			String username, String password, String pathname, String fileName,
    			InputStream inputStream) {
    		boolean flag = false;
    		FTPClient ftpClient = new FTPClient();
    		try {
    			// 连接FTP服务器
    			ftpClient.connect(hostname, port);
    			// 登录FTP服务器
    			ftpClient.login(username, password);
    			ftpClient.setControlEncoding("UTF-8"); // 中文支持
    			ftpClient.setConnectTimeout(5000); 	 // 超时设置
    			// 是否成功登录FTP服务器
    			int replyCode = ftpClient.getReplyCode();
    			if (!FTPReply.isPositiveCompletion(replyCode)) {
    				ftpClient.disconnect();
    				return flag;
    			}
    			ftpClient.enterLocalPassiveMode();
    			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
    			ftpClient.changeWorkingDirectory(pathname);
    			ftpClient.storeFile(fileName, inputStream);
    			inputStream.close();
    			ftpClient.logout();
    			flag = true;
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (ftpClient.isConnected()) {
    				try {
    					ftpClient.disconnect();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    		return flag;
    	}
    

     特此记录,希望能帮助需要的人!

  • 相关阅读:
    二线城市的创业人才之战
    小程序的风口到底如何?
    短视频广告一条上百万,揭秘短视频背后的故事
    让我们来看看这些企业的创始人,在互联网金融的十年里的故事
    背靠大树成为创业成功的显学
    草根站长的艰辛创业路
    互联网大佬们的创业重要选择时刻
    80后的罗敏已经在创业路上走了十几年
    CentOS7 通过 YUM 升级 VIM8
    matplotlib 画图中的basemap安装问题
  • 原文地址:https://www.cnblogs.com/babysbreath/p/7509517.html
Copyright © 2011-2022 走看看