Android TCP - вылет программы - PullRequest
       7

Android TCP - вылет программы

0 голосов
/ 20 января 2011

Не получается установить простое TCP-соединение между приложением java-сервера и Android (я пробовал и эмулятор, и Android Dev Phone 2). Я получаю эту ошибку на эмуляторе: «Прием данных приложения (процесс com.mdog.datareceive) неожиданно остановлен. Пожалуйста, повторите попытку».

Простите, но я очень плохо знаком с Android. Так что я не знаю, как отладить это ... но я не пытаюсь ничего слишком сложного. В конце концов я хочу попытаться «потреблять» байты, которые я получаю в приложении. и TCP работает в фоновом режиме ... но сейчас было бы просто подключить телефон и компьютер к общению.

Если бы вы могли мне помочь, это было бы здорово.

Код для стороны Android:

public class Receive extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView tv = new TextView(this);

        Socket connectionSocket = null;
        byte[] inputHolderByteArray = new byte[5*1024];

        /* Connect to Server */
        try {
            connectionSocket = new Socket("192.168.0.104", 11313);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        /* Send an s to server to start transmission */
        try {
            PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true);
            out.print('s');
            out.flush();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        /* read server transmission */
        try {
            connectionSocket.getInputStream().read(inputHolderByteArray);
        } catch (IOException e) {
            e.printStackTrace();
        }

        tv.setText("done");
        setContentView(tv);

    }

}

Ответы [ 2 ]

1 голос
/ 20 января 2011

Каждый экземпляр эмулятора работает за службой виртуального маршрутизатора / брандмауэра, которая изолирует его от сетевых интерфейсов и настроек компьютера разработчика и от Интернета.

Виртуальный маршрутизатор для каждого экземпляра управляет сетевым адресным пространством 10.0.2 / 24 - все адреса, управляемые маршрутизатором, имеют вид 10.0.2., Где это число. Адреса в этом пространстве предварительно выделяются эмулятором / маршрутизатором.

Вы должны ссылаться на машину для разработки с адресом: 10.0.2.2 вместо 192.168.0.104 в вашем случае. Если вы хотите обратиться к другому компьютеру в вашей локальной сети, вы можете Использовать перенаправления сети

http://developer.android.com/guide/developing/tools/emulator.html#emulatornetworking

0 голосов
/ 20 января 2011

Хотя superfell верно, что трассировка полного стека поможет диагностировать это, исходя из вашего кода, вероятная проблема заключается в том, что вы разбиваете каждый оператор на отдельные блоки try / catch. Вероятно, это не ваша основная проблема (я думаю, у вас есть проблема с сетью), но именно это приводит к сбою системы.

Как правило, в Java операторы, которые зависят друг от друга и могут генерировать исключения, помещаются в один и тот же оператор try / catch. Скорее всего, для вас происходит то, что код входит в ваш первый блок catch catch, где вы пытаетесь определить новый сокет. Это не может вызвать исключение, например «UnknownHostException». connectionSocket остается нулевым, но код входит в перехват для UnknownHostException. Вы печатаете трассировку стека, но программа не выходит. Ваш код переходит к следующему блоку try / catch, где вы звоните

 PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true);

Это вызывает исключение NullPointerException. Это RuntimeException, которое не проверяется, и, поскольку оно не проверено, вы не обязаны перехватывать его в операторе catch. Это исключение теперь приводит к сбою вашей виртуальной машины и к сообщению об ошибке, о котором вы сообщили.

Итак, хотя получение трассировки стека logcat расскажет нам больше о вашей проблеме, созданный вами код должен быть сведен в один оператор try / catch, поскольку весь код зависит от первого завершения try / catch, завершающегося без ошибок.

Редактировать:

Попробуйте создать приложение таким образом

public class Receive extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TextView tv = new TextView(this);

    Socket connectionSocket = null;
    byte[] inputHolderByteArray = new byte[5*1024];

    /* Connect to Server */
    try {
        connectionSocket = new Socket("192.168.0.104", 11313);
        PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true);
        out.print('s');
        out.flush();
        connectionSocket.getInputStream().read(inputHolderByteArray);
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    tv.setText("done");
    setContentView(tv);

}

}

Когда мы говорим «получить трассировку стека», это означает, что вам нужно подключиться к эмулятору или устройству с помощью моста отладки Android (ADB) и программы с именем logcat. Если у вас есть только эмулятор, и к вашему компьютеру не подключен телефон, попробуйте выполнить следующее: adb logcat *: D Это выведет информацию журнала на терминал. Оставьте это окно открытым и запустите ваше приложение. Вы должны увидеть отпечаток стека. Пожалуйста, найдите время, чтобы познакомиться с logcat и adb.

...