Приложение Java ftpclient не подключается

Я новичок в программировании на Android и Java. Я пишу следующий код для подключения к ftp-серверу

public class NewMainActivity extends Activity {
TextView Display;
//declare a public FTP client object.
public FTPClient mFTPClient = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_main);
    final TextView Display = (TextView) findViewById(R.id.tvResults);

    try {
         mFTPClient = new FTPClient();

          // connecting to the host
         mFTPClient.connect("www.filegenie.com",21); 

          // now check the reply code, if positive mean connection success
          if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
              // login using username & password
              boolean status = mFTPClient.login("user", "MyPassword");

              // Set File Transfer Mode

              mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
              mFTPClient.enterLocalPassiveMode();

              Display.setText("Correct"+ String.valueOf(status)); //return status;
          }

        }catch(Exception e) {
             Display.setText(" Exception message is = "+e.getMessage()+" Reply code = "+mFTPClient.getReplyCode());

        }

}

Когда я запускаю этот код, я не получаю конкретной ошибки, но программа не выполняет метод mFTPClient.connect и переходит к части «Исключение», и я получаю «null» в качестве исключения getMessage и «0» в качестве ReplyCode. Я импортировал все необходимые файлы, такие как

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

Я использую eclipse и ADT Build v22.0.1-685705. Я также включил файлы commons-net-3.3, commons-net-3.3-sources и commons-net-examples-3.3 в библиотеку проекта Android, а также включил файлы и папки java из commons-net-3.3-src | источник | главная | джава | орг | апач | достояние | net в папку src проекта Android, создав папки org | апач | достояние | сеть. Я не мог понять, в чем проблема. Может ли кто-нибудь помочь мне в этом отношении.

К тому же серверу можно получить доступ с помощью коммерческого ftp-клиента.

Заранее спасибо.


person Mudasser Naseer    schedule 02.09.2013    source источник


Ответы (1)


Я попробовал ваш код, и он работает нормально. Основываясь на коде ответа, который вы получаете, я предполагаю, что соединение с сервером даже не установлено. Убедитесь, что вы предоставили своему приложению разрешение INTERNET в файле манифеста:

<uses-permission android:name="android.permission.INTERNET" /> 

EDIT: Из трассировки стека исключений видно, что вы пытаетесь выполнить этот код из основного потока. В Android 3.0 (Honeycomb) или более поздних версиях по умолчанию вам не разрешено выполнять какие-либо сетевые вызовы в потоке пользовательского интерфейса. Причина проста: сетевой вызов может быть заблокирован на неопределенное время, что приведет к зависанию пользовательского интерфейса приложения. У вас есть два варианта, как это исправить:

Ленивый способ – отключите проверку радиосвязи для сетевых вызовов:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                                     .permitAll()
                                     .build();   
StrictMode.setThreadPolicy(policy);

Вы всегда можете снова включить проверку потоков, используя

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                                     .detectAll()
                                     .penaltyLog()
                                     .penaltyDeath()
                                     .build();
StrictMode.setThreadPolicy(policy);

Правильный способ — выполнение вызовов FTP из фонового рабочего потока с помощью AsyncTask. Взгляните на здесь примеры и подробное объяснение AsyncTasks.

person Jk1    schedule 02.09.2013
comment
Уважаемый, спасибо за ответ, я уже пробовал доступ в ИНТЕРНЕТ, но он все еще не работает. Вам нужно применить какие-либо другие специальные настройки для кода? - person Mudasser Naseer; 03.09.2013
comment
@MudasserNaseer, можно ли получить тип исключения и трассировку стека? - person Jk1; 03.09.2013
comment
Я получил следующую трассировку стека, я не знаю, как определить тип исключения. Часть I: android.os.NetworkOnMainThreadException\n\tat android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)\n\tat java.net.InetAddress.lookupHostByName(InetAddress.java:385)\n\ tat java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)\n\tat java.net.InetAddress.getByName(InetAddress.java:289)\n\tat org.apache.commons.net.SocketClient.connect(SocketClient .java:203)\n\tat com.example.new_1.NewMainActivity.onCreate(NewMainActivity.java:27)\n\tat - person Mudasser Naseer; 03.09.2013
comment
Часть 2 android.app.Activity.performCreate(Activity.java:5104)\n\tat android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)\n\tat android.app.ActivityThread.performLaunchActivity(ActivityThread.java :2144)\n\tat android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)\n\tat android.app.ActivityThread.access$600(ActivityThread.java:141)\n\tat android.app.ActivityThread$ H.handleMessage(ActivityThread.java:1234)\n\tat android.os.Handler.dispatchMessage(Handler.java:99)\n\tat android.os.Looper.loop(Looper.java:137)\n\tat - person Mudasser Naseer; 03.09.2013
comment
Часть 3 android.app.ActivityThread.main(ActivityThread.java:5041)\n\tat java.lang.reflect.Method.invokeNative(Native Method)\n\tat java.lang.reflect.Method.invoke(Method. java:511)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) \n\tat dalvik.system.NativeStart.main(собственный метод)\n - person Mudasser Naseer; 03.09.2013
comment
Спасибо, теперь совершенно ясно. Пожалуйста, обратитесь к отредактированному ответу. - person Jk1; 04.09.2013
comment
Уважаемый JK1 спасибо за ответ, проблема решена. Я использовал ленивый способ. Я не знаю, как использовать AsyncTasks, но я пройдусь по нему и попытаюсь его использовать. Можете ли вы прислать мне синтаксис, чтобы снова включить проверку потока для сетевых вызовов после выполнения определенной задачи. Спасибо еще раз за помощь. - person Mudasser Naseer; 04.09.2013
comment
Смотрите обновленный ответ. Однако я настоятельно рекомендую использовать AsyncTasks. Это очень полезный инструмент для Android-разработчика. - person Jk1; 04.09.2013