Java FTPClient:调用 getReply() 时获取 "Connection reset by peer"
Java FTPClient: Getting "Connection reset by peer" when calling getReply()
我最近试图通过移动应用程序连接到 FTP 服务器。
我能够连接到我的服务器并检查它是否已连接(它是)。
接下来是使用用户名和密码登录,然后进行被动模式设置。我做的最后一件事是从服务器获取回复代码,但是当我的应用程序是 运行 时,我的屏幕变黑了。当我重新打开我的应用程序时,它显示 "recv failed: ECONNREST (Connection reset by peer)" 作为我输出的错误消息。这是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
ftpClient = new FTPClient();
textView = (TextView)findViewById(R.id.textView_id);
textView2 = (TextView)findViewById(R.id.textView2_id);
textView3 = (TextView)findViewById(R.id.textView3_id);
textView4 = (TextView)findViewById(R.id.textView4_id);
textView5 = (TextView)findViewById(R.id.textView5_id);
try{
ftpClient.connect(ip, port);
boolean connectSucces = ftpClient.isConnected();
ftpClient.login(userName,passWord);
ftpClient.enterLocalPassiveMode();
ftpClient.getReply();
int connectionMode = ftpClient.getDataConnectionMode();
if(connectionMode == ftpClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE) {
textView.setText("Connected: " + connectSucces + " ConnectionMode: " + connectionMode);
}
}catch(Exception e){
textView.setText(e.getMessage());
}
}
我是不是漏掉了什么?
我认为是对 getReply()
的调用使您的代码陷入僵局。
您没有发送任何服务器应回复的命令,因此客户端等待响应,直到它或服务器超时。
后者可能发生了,这就是服务器 closed/reset 连接的原因。
您通常不会给自己打电话 getReply()
。在大多数情况下,它由 FTPClient
内部为您调用:
Only use this method if you are implementing your own FTP client or if you need to fetch a secondary response from the FTP server.
虽然我没有 Android 开发经验,但从症状和您的代码来看,我假设您从 GUI 线程连接到 FTP 服务器,这是一种不好的做法。这可以解释为什么在您等待时屏幕会变黑。
我最近试图通过移动应用程序连接到 FTP 服务器。 我能够连接到我的服务器并检查它是否已连接(它是)。 接下来是使用用户名和密码登录,然后进行被动模式设置。我做的最后一件事是从服务器获取回复代码,但是当我的应用程序是 运行 时,我的屏幕变黑了。当我重新打开我的应用程序时,它显示 "recv failed: ECONNREST (Connection reset by peer)" 作为我输出的错误消息。这是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
ftpClient = new FTPClient();
textView = (TextView)findViewById(R.id.textView_id);
textView2 = (TextView)findViewById(R.id.textView2_id);
textView3 = (TextView)findViewById(R.id.textView3_id);
textView4 = (TextView)findViewById(R.id.textView4_id);
textView5 = (TextView)findViewById(R.id.textView5_id);
try{
ftpClient.connect(ip, port);
boolean connectSucces = ftpClient.isConnected();
ftpClient.login(userName,passWord);
ftpClient.enterLocalPassiveMode();
ftpClient.getReply();
int connectionMode = ftpClient.getDataConnectionMode();
if(connectionMode == ftpClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE) {
textView.setText("Connected: " + connectSucces + " ConnectionMode: " + connectionMode);
}
}catch(Exception e){
textView.setText(e.getMessage());
}
}
我是不是漏掉了什么?
我认为是对 getReply()
的调用使您的代码陷入僵局。
您没有发送任何服务器应回复的命令,因此客户端等待响应,直到它或服务器超时。
后者可能发生了,这就是服务器 closed/reset 连接的原因。
您通常不会给自己打电话 getReply()
。在大多数情况下,它由 FTPClient
内部为您调用:
Only use this method if you are implementing your own FTP client or if you need to fetch a secondary response from the FTP server.
虽然我没有 Android 开发经验,但从症状和您的代码来看,我假设您从 GUI 线程连接到 FTP 服务器,这是一种不好的做法。这可以解释为什么在您等待时屏幕会变黑。