SocketException:FTP 上传时连接重置
SocketException: Connection reset while FTP upload
我正在尝试将文件上传到 FTP 服务器。
这是我的代码:
FTPClient ftpClient = new FTPClient();
try {
List<PoiCmsRule> appPois = getAllRules();
try (FileWriter writer = new FileWriter(backupFile)) {
new Gson().toJson(backupData, writer);
}
try (FileInputStream fis = new FileInputStream(backupFile)) {
ftpClient.connect(host);
ftpClient.login(login, password);
ftpClient.storeFile("backup.json", fis);
ftpClient.logout();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
当我在本地主机上 运行 它工作得很好。但是当我 运行 在服务器上时,我得到这个异常:
Caused by: java.net.SocketException: Connection reset
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
我认为这表明我的防火墙或代理可能有问题。
这是 Spring 在 Ubuntu 服务器上使用 Nginx 作为代理的启动应用程序 运行。
如何找到导致此异常的原因?
在被动模式下与命令行 ftp
成功连接的日志:
ubuntu@ip-server:~$ ftp -p -d my_host
Connected to my_host
220 FTP-Server
ftp: setsockopt: Bad file descriptor
Name (my_host): username
---> USER username
331 Please specify the password.
Password:
---> PASS XXXX
230 Login successful.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PASV
227 Entering Passive Mode (153,92,207,128,127,65)
---> LIST
150 Here comes the directory listing.
// file list
226 Directory send OK.
ftp>
Apache Commons Net FTPClient
默认为 FTP active 模式。由于无处不在的防火墙和 NAT,主动模式几乎无法工作(有关详细信息,请参阅我在 FTP active/passive connection modes 上的文章)。
要将 FTPClient
切换到 被动 模式,请在 after FTPClient.connect
某处调用 FTPClient.enterLocalPassiveMode
:
ftpClient.connect(host);
ftpClient.login(login, password);
ftpClient.enterLocalPassiveMode();
我正在尝试将文件上传到 FTP 服务器。
这是我的代码:
FTPClient ftpClient = new FTPClient();
try {
List<PoiCmsRule> appPois = getAllRules();
try (FileWriter writer = new FileWriter(backupFile)) {
new Gson().toJson(backupData, writer);
}
try (FileInputStream fis = new FileInputStream(backupFile)) {
ftpClient.connect(host);
ftpClient.login(login, password);
ftpClient.storeFile("backup.json", fis);
ftpClient.logout();
}
} catch (Exception e) {
log.error(e.getMessage(), e);
} finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
当我在本地主机上 运行 它工作得很好。但是当我 运行 在服务器上时,我得到这个异常:
Caused by: java.net.SocketException: Connection reset
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
我认为这表明我的防火墙或代理可能有问题。
这是 Spring 在 Ubuntu 服务器上使用 Nginx 作为代理的启动应用程序 运行。
如何找到导致此异常的原因?
在被动模式下与命令行 ftp
成功连接的日志:
ubuntu@ip-server:~$ ftp -p -d my_host
Connected to my_host
220 FTP-Server
ftp: setsockopt: Bad file descriptor
Name (my_host): username
---> USER username
331 Please specify the password.
Password:
---> PASS XXXX
230 Login successful.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PASV
227 Entering Passive Mode (153,92,207,128,127,65)
---> LIST
150 Here comes the directory listing.
// file list
226 Directory send OK.
ftp>
Apache Commons Net FTPClient
默认为 FTP active 模式。由于无处不在的防火墙和 NAT,主动模式几乎无法工作(有关详细信息,请参阅我在 FTP active/passive connection modes 上的文章)。
要将 FTPClient
切换到 被动 模式,请在 after FTPClient.connect
某处调用 FTPClient.enterLocalPassiveMode
:
ftpClient.connect(host);
ftpClient.login(login, password);
ftpClient.enterLocalPassiveMode();