• 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;
    	}
    

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

  • 相关阅读:
    (收藏)Wp7开发中文网站
    (收藏)Andriod中文翻译组
    (1) BlackBerry 环境的配置:安装standalone版的BlackBerry安装包
    (2)把BlackBerry作为插件安装到已有的Eclipse中
    (收藏)一个很不错的编程网站
    Android Architecture
    在Eclipse Android中设置模拟器屏幕大小
    (收藏)C#网站
    (Android) Binding to Data with AdapterView
    ListView 的理解
  • 原文地址:https://www.cnblogs.com/babysbreath/p/7509517.html
Copyright © 2020-2023  润新知