Почему мое UDP-сообщение с Android не работает?

#java #android #udp

#java #Android #udp

Вопрос:

Я написал небольшой Java-скрипт, который отправляет сообщение через UDP на сервер на моем компьютере:

 @Override
public void onClick(View view) {
    try {
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress IP = InetAddress.getByName("192.168.1.5");
        byte[] sendData = new byte[1024];
        String sentence = "HELLO";

        sendData = sentence.getBytes();

        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IP, 9876);
        clientSocket.send(sendPacket);

        clientSocket.close();
    } catch(IOException e) {

    }
}
  

Я попробовал тот же код с другого компьютера в сети, и затем сообщение правильно отправляется и принимается. Когда я пытаюсь запустить это со своего телефона Android, сервер его не получит. Почему это?

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

Я забыл добавить разрешение доступа в Интернет в манифест, но когда я это сделал, приложение вылетает при нажатии кнопки:

 06-13 21:14:26.932  13501-13501/com.example.omgandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1144)
        at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:175)
        at libcore.io.IoBridge.sendto(IoBridge.java:466)
        at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182)
        at java.net.DatagramSocket.send(DatagramSocket.java:284)
        at com.example.omgandroid.MainActivity.onClick(MainActivity.java:72)
        at android.view.View.performClick(View.java:4475)
        at android.view.View$PerformClick.run(View.java:18786)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:5419)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
        at dalvik.system.NativeStart.main(Native Method)
06-13 21:14:38.987  13501-13501/com.example.omgandroid I/Process﹕ Sending signal. PID: 13501 SIG: 9
  

Что может быть причиной этого?

Комментарии:

1. если ваш телефон Android использует вашу локальную сеть? если оно передается через сотовые данные, 192.168 сетевой блок не может быть использован — они являются «частными» блоками и не маршрутизируются. Ваш поставщик данных сотовой связи буквально не будет знать, где находится этот IP-адрес.

2. Телефон, конечно, подключен к Wi-Fi, но я не уверен, отправляется ли сообщение через Wi-Fi или 3g. Откуда я это знаю?

3. Проверьте исключение, которое вы улавливаете, и посмотрите, появляется ли там что-нибудь. Я предполагаю, что вы забыли запросить разрешения на доступ в Интернет в своем манифесте Android.

4. Вы правы! Но теперь появляется другая проблема, см. Исходное сообщение.

Ответ №1:

Android не разрешает сетевые подключения из основного потока ( NetworkOnMainThreadException ), чтобы не блокировать пользовательский интерфейс. Они хотят, чтобы пользовательский интерфейс был отзывчивым и не блокировался сетевыми операциями, поэтому пользователь не подумает, что приложение разбилось.

Вы должны выполнять сетевые действия внутри нового потока.

AsyncTask подходит для этого.