Bluetooth в Java Mobile: обработка соединений, которые выходят из диапазона

StackOverflow https://stackoverflow.com/questions/4537617

Вопрос

Я пытаюсь реализовать соединение сервера-клиента через SPP.

После инициализации сервера я запускаю поток, который сначала прослушивает клиентов, а затем получает от них данные. Похоже:

public final void run() {
    while (alive) {
        try {
            /*
             * Await client connection
             */
            System.out.println("Awaiting client connection...");
            client = server.acceptAndOpen();

            /*
             * Start receiving data
             */
            int read;
            byte[] buffer = new byte[128];
            DataInputStream receive = client.openDataInputStream();
            try {
                while ((read = receive.read(buffer)) > 0) {
                    System.out.println("[Recieved]: "
                            + new String(buffer, 0, read));

                    if (!alive) {
                        return;
                    }
                }
            } finally {
                System.out.println("Closing connection...");
                receive.close();
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

Это работает нормально, я могу получать сообщения. Что меня беспокоит, так это то, как поток в конечном итоге умрет, когда устройство выйдет из диапазона?

Во -первых, призыв к receive.read(buffer) блокируется так, чтобы поток ожидал, пока он не получит какие -либо данные. Если устройство выйдет из диапазона, оно никогда не будет продолжаться, чтобы проверить, будет ли оно прервано.

Во -вторых, он никогда не закроет соединение, то есть сервер не примет устройство, как только оно вернется в диапазоне.

Это было полезно?

Решение

Когда удаленное устройство выходит из диапазона, после истечения срока действия временного анализа контроля, локальный стек должен закрыть соединение. В зависимости от реализации JSR-82, receive.read(buffer) вернется -1 или бросит IOException. Анкет Вы можете имитировать это, отключив удаленное устройство или перемещая его из диапазона.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top