2013-06-21 3 views
0

Мне нужно разработать приложение, которое время от времени будет связывать устройства (одно устройство отправляет простое сообщение, другое отправляет ответ).BluetoothServerSocket: как обрабатывать последующие соединения

Это сообщение не будет происходить слишком часто (один раз в несколько минут), поэтому не представляется разумным поддерживать постоянное соединение между устройствами. Кроме того, по какой-то причине соединение может быть потеряно, поэтому мне понадобится какая-то логика восстановления.

Вместо этого я бы предпочел, чтобы приложение устанавливало новое соединение каждый раз, когда ему нужно было отправлять данные сверстнику. Однако спецификации говорят, что после того, как BluetoothServerSocket.accept вернется, серверный сокет должен быть закрыт. Это означает, что приложение больше не сможет получать последующие входящие соединения.

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

ответ

0

Документация гласит: «BluetoothServerSocket может (и должен) быть отброшен, если вы не хотите принимать больше соединений». Поскольку вы хотите принять больше соединений, тогда вы должны их сохранить.

В документации также говорится о методе принятия ServerSocket. Принять является блокирующим вызовом. Он вернется, когда либо соединение будет принято, либо возникло исключение. Соединение принимается только тогда, когда удаленное устройство отправило запрос на соединение с UUID, соответствующим тому, который зарегистрирован в этом гнезде для прослушивающего сервера. В случае успеха accept() вернет подключенный BluetoothSocket.

+0

Я протестировал свою первоначальную идею (вечный серверный сокет + синхронная обработка). Кажется, что он работает: входящие соединения ждут своей очереди, чтобы их приняли. Однако иногда клиентские сокеты не могут подключиться (тайм-аут?), И одно из устройств даже не отключилось во время ожидания. –

+0

Похоже, мне нужно создать отдельный серверный сокет для каждого однорангового устройства. –