超时后重新生成UDP服务器

时间:2018-11-14 09:59:30

标签: android udp

我正在编写一个Android应用程序(API 24),该应用程序应该通过 UDP 连接接收遥测消息。只要(无线)连接处于良好状态,它就可以正常工作,只要它会使 UDP 接收器降级,并且即使连接再次处于良好状态,我也无法重生。< / p>

这是我的代码:

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)指令似乎是问题的根源而不是部分修复。

我可能正在执行其他一些错误,但我无法捕获它。

0 个答案:

没有答案