Восстановление сервера UDP после тайм-аута - PullRequest
0 голосов
/ 14 ноября 2018

Я пишу приложение для Android (API 24), которое должно получать телеметрические сообщения через UDP соединение. Он работает нормально, если (беспроводное) соединение находится в хорошем состоянии, если оно ухудшает работу приемника UDP , и я не могу возродиться, даже если соединение снова находится в хорошем состоянии.

Это мой код:

private class UDPReceiver extends Thread {
    private boolean keepRunning = true;
    private int UDP_SERVER_PORT;
    public Queue<String> messagesQueue = new LinkedList<>();

    public void run() {
        byte[] buffer = new byte[MAX_UDP_DATAGRAM_LEN];

        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        DatagramSocket socket = null;

        do {
            try {
                socket = new DatagramSocket(UDP_SERVER_PORT);
                socket.setReuseAddress(true);

                while (keepRunning) {
                    socket.receive(packet);
                    messagesQueue.add(new String(buffer, 0, packet.getLength()));
                    runOnUiThread(updateTelemetry);
                }
            } catch (Throwable e) {
                Log.e(this.getClass().getName(), e.getMessage());
                e.printStackTrace();
            }

            try {
                Thread.sleep(UDP_SERVER_RESPAWN);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } while (keepRunning);

        if (socket != null) {
            socket.close();
        }
    }

private Runnable updateTelemetry = new Runnable() {
    public void run() {
        if (gcsUDPReceiver == null) return;

        final String message = gcsUDPReceiver.messagesQueue.poll();

        if (message == null) return;

        telemetryTask(message);
    }
};

Я думал, что внешний цикл do...while в UDPReceiver должен исправить проблему, порождая мертвое соединение, но это не работает, как я ожидал, более того, директива setReuseAddress(true) кажется источником проблем, а не частичным исправлением.

Возможно, я совершаю какую-то другую ошибку, но не могу ее перехватить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...