Bluetooth в Java Mobile: обработка соединений, которые выходят из диапазона
-
13-10-2019 - |
Вопрос
Я пытаюсь реализовать соединение сервера-клиента через 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
. Анкет Вы можете имитировать это, отключив удаленное устройство или перемещая его из диапазона.