Bluetooth в Java Mobile: обработка соединений, выходящих за пределы диапазона - PullRequest
3 голосов
/ 27 декабря 2010

Я пытаюсь реализовать соединение сервер-клиент по 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) блоков, так что поток ожидает, пока не получит какие-либо данные.Если устройство выходит за пределы диапазона, оно никогда не будет продолжать проверять, не прервано ли оно между тем.

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

1 Ответ

3 голосов
/ 02 января 2011

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

...