Отправка UDP через android не может быть автоматической - PullRequest
0 голосов
/ 23 февраля 2020

Я могу отправить и получить udp, проблема, с которой я столкнулся сейчас, заключается в том, что когда мне нужно автоматизировать c отправка данных с клиента на сервер (чтобы доказать, что клиент жив), сервер не может получить данные , но когда я посылаю живой статус через событие Button. это сработало. вот мой код

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        establishConnection();
        /* Working */
        Button send = new Button(this);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 new Thread(new Runnable() {
            @Override
            public void run() {
                DatagramPacket receivePacket = null;
                byte[] command = (room+":Alive").getBytes();
                try {
                    receivePacket = new DatagramPacket(command, command.length, InetAddress.getByName(UrlColletion.hostAddress), 8084);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                java.lang.System.out.println("Sending");

                try {
                    serverSocket1.send(receivePacket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
            }
        });
        /* Not Working*/
        final Handler handler = new Handler(Looper.getMainLooper());
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    DatagramPacket receivePacket = null;
                    byte[] command = (room + ":Alive").getBytes();
                    try {
                        receivePacket = new DatagramPacket(command, command.length, InetAddress.getByName(UrlColletion.hostAddress), 8084);
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    java.lang.System.out.println("Sending");

                    try {
                        serverSocket1.send(receivePacket);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                } finally {
                    //also call the same runnable to call it at regular interval
                    handler.postDelayed(this, 5000);
                }
            }
        };
        handler.post(runnable);
        setContentView(send);
    }
    DatagramSocket serverSocket1;
    void establishConnection(){
        try {
            serverSocket1 = new DatagramSocket(7070);
            serverSocket1.setReuseAddress(true);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean isOpen = true;
                while(isOpen) {
                    byte []message = new byte[1024];
                    DatagramPacket receivePacket = new DatagramPacket(message, 1024);
                    try {
                        serverSocket1.receive(receivePacket);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    String text = new String(message, 0, receivePacket.getLength());
                    System.out.println(text);
                }
                serverSocket1.close();
            }
        }).start();
    }

код выше проверен. когда он отправляет через обработчик, сервер не может получить никаких данных, а кнопка - может. Дополнительная информация, код работает на эмуляторе, но когда он приходит на телефон, проблема выходит. это значит, что на эмуляторе успешно отправляется UDP, но на телефоне, нет .

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Не знаю почему, но я просто об этом.

final Handler handler = new Handler(Looper.getMainLooper());
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            DatagramPacket receivePacket = null;
                            byte[] command = (room + ":Alive").getBytes();
                            try {
                                receivePacket = new DatagramPacket(command, command.length, InetAddress.getByName(UrlColletion.hostAddress), 8084);
                            } catch (UnknownHostException e) {
                                e.printStackTrace();
                            }
                            java.lang.System.out.println("Sending");

                            try {
                                serverSocket1.send(receivePacket);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        }
                    }).start();
                } catch (Exception e) {
                    // TODO: handle exception
                } finally {
                    //also call the same runnable to call it at regular interval
                    handler.postDelayed(this, 5000);
                }
            }
        };
        handler.post(runnable);
0 голосов
/ 23 февраля 2020

Попробуйте отключить оптимизацию батареи или, возможно, реализовать wakelock. https://developer.android.com/training/scheduling/wakelock

Intent intent = new Intent();
intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
startActivity(intent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...