Сокет Android-сервера Bluetooth будет заблокирован при приеме (), если он обрабатывает более одного соединения

Я изучил пример Android Bluetooth.

Я изучал на примере android bluetooth.

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

Возможно ли устройство Android, которое может выполнять серверный сокет и принимать множество соединений, а не только одно соединение? Есть ли причина, по которой сервер заблокирован функцией accept (), например, неправильный UUID или что-то в этом роде?

Я выполняю операцию следующим образом:

  1. Для первого подключения создайте сокет сервера и подождите для соединения
  2. клиент B отправляет запрос на соединение
  3. серверный сокет accept
  4. обрабатывает поток ввода-вывода
  5. использует тот же серверный сокет для повторного ожидания соединения (я не закрываю серверный сокет)
  6. клиент C отправляет запрос на соединение
  7. серверный сокет заблокирован, заблокирован, заблокирован, а не принято ...

Потому что первое соединение прошло успешно, и я не меняю UUID при втором соединении. Поэтому я думаю, что UUID - это не ключ. Когда установлено первое соединение, серверный сокет будет ждать другого соединения. К сожалению, он просто ждет и блокируется, а не принимает первое соединение.

public void run() {
    if (D) Log.d(TAG, "BEGIN ServerSocketThread" + this);
    BluetoothSocket socket = null;
    while(true) {
        try {
            Log.i(TAG, "[ServerSocketThread] Enter while loop");
            socket = mmServerSocket.accept();                                     
            Log.i(TAG, "[ServerSocketThread] Got client socket");                    
        } catch (IOException e) {
            Log.e(TAG, "accept() failed", e);
            break;
        }

        if (socket!=null) {
            synchronized (BluetoothConnService.this) {                       
                Log.i(TAG, "[ServerSocketThread] "+socket.getRemoteDevice()+" is connected.");
                ConnectedThread tmpThread = new ConnectedThread(socket); 
                tmpThread.start();
                break;
            }
        }

    }   
    BluetoothConnService.this.startSession();
}

Это часть потока сокета сервера. Всякий раз, когда я хочу установить второе соединение, logcat показывает, что он остановится после журнала " [ServerSocketThread] Enter while loop. " Кажется, операция заблокирована на accept () , но серверный сокет не генерирует исключение IOException для mmServerSocket.accept () . Когда установлено первое соединение, серверный сокет будет ждать следующего соединения. К сожалению, он просто ждет и блокируется, а не принимает первое соединение.

public void run() {
    if (D) Log.d(TAG, "BEGIN ServerSocketThread" + this);
    BluetoothSocket socket = null;
    while(true) {
        try {
            Log.i(TAG, "[ServerSocketThread] Enter while loop");
            socket = mmServerSocket.accept();                                     
            Log.i(TAG, "[ServerSocketThread] Got client socket");                    
        } catch (IOException e) {
            Log.e(TAG, "accept() failed", e);
            break;
        }

        if (socket!=null) {
            synchronized (BluetoothConnService.this) {                       
                Log.i(TAG, "[ServerSocketThread] "+socket.getRemoteDevice()+" is connected.");
                ConnectedThread tmpThread = new ConnectedThread(socket); 
                tmpThread.start();
                break;
            }
        }

    }   
    BluetoothConnService.this.startSession();
}

Это часть потока сокета сервера. Всякий раз, когда я хочу установить второе соединение, logcat показывает, что он остановится после журнала " [ServerSocketThread] Enter while loop. " Кажется, операция заблокирована на accept () , но серверный сокет не генерирует исключение IOException для mmServerSocket.accept () . Когда установлено первое соединение, серверный сокет будет ждать следующего соединения. К сожалению, он просто ждет и блокируется, а не принимает первое соединение.

public void run() {
    if (D) Log.d(TAG, "BEGIN ServerSocketThread" + this);
    BluetoothSocket socket = null;
    while(true) {
        try {
            Log.i(TAG, "[ServerSocketThread] Enter while loop");
            socket = mmServerSocket.accept();                                     
            Log.i(TAG, "[ServerSocketThread] Got client socket");                    
        } catch (IOException e) {
            Log.e(TAG, "accept() failed", e);
            break;
        }

        if (socket!=null) {
            synchronized (BluetoothConnService.this) {                       
                Log.i(TAG, "[ServerSocketThread] "+socket.getRemoteDevice()+" is connected.");
                ConnectedThread tmpThread = new ConnectedThread(socket); 
                tmpThread.start();
                break;
            }
        }

    }   
    BluetoothConnService.this.startSession();
}

Это часть потока сокета сервера. Всякий раз, когда я хочу установить второе соединение, logcat показывает, что он остановится после журнала " [ServerSocketThread] Enter while loop. " Кажется, операция заблокирована на accept () , но серверный сокет не генерирует исключение IOException для mmServerSocket.accept () .

Я понятия не имею, почему сокет не принимается и не выдает исключение, просто заблокирован там, если я хочу установить второе соединение. Я признателен за любые возможные причины или предложения.

Вот список каталогов, когда я запускаю приложение. Я надеюсь, что это поможет выявить проблему.

Часть A: Это успешное соединение и первое соединение

12-12 22:42:05.358: DEBUG/BluetoothSppPort(889): Creating a BluetoothSpp proxy object
12-12 22:42:05.378: DEBUG/BluetoothSppService(122): createPort called!
12-12 22:42:05.378: DEBUG/BluetoothSppService(122): createPort checking uuid
12-12 22:42:05.388: DEBUG/BluetoothSppService(122): createPort UUID=00001101-0000-1000-8000-00805f9b34fb auth=true encrypt=true
12-12 22:42:05.388: DEBUG/BluetoothSppService(122): createPort enforcing bluetooth perm
12-12 22:42:05.388: DEBUG/BluetoothSppService(122): createPort creating a jbtlspp object
12-12 22:42:05.388: DEBUG/BluetoothSppService(122): createPort checking if the btl spp object is valid
12-12 22:42:05.388: DEBUG/BluetoothSppService(122): createPort try to create an spp container
12-12 22:42:05.388: DEBUG/BluetoothSppService(122): createPort try to create security params
12-12 22:42:05.388: DEBUG/BluetoothSppService(122): createPort Set Security L2
12-12 22:42:05.388: DEBUG/BluetoothSppService(122): createPort spp port create
12-12 22:42:05.418: DEBUG/JBtlSpp(122): create: Entered
12-12 22:42:05.418: DEBUG/JBtlSpp(122): Calling NativeJBtlSpp_Create
12-12 22:42:05.418: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Create: Entered
12-12 22:42:05.418: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Create: Calling BTL_SPP_Remote_Create
12-12 22:42:05.598: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Create: BTL_SPP_Remote_Create returned 0, context:f
12-12 22:42:05.598: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Create: Setting context value in jContext out parm
12-12 22:42:05.598: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Create: Calling Java setValue(0xf) in context's class
12-12 22:42:05.598: DEBUG/JBtlProfileContext(122): setValue: setValue called, value:15
12-12 22:42:05.598: DEBUG/JBtlSppNative(122): create_spp_port_data: will use context struct 0 for the port 15
12-12 22:42:05.608: DEBUG/JBtlSppNative(122): create_spp_port_data: spp port context 0 added
12-12 22:42:05.608: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Create:Exiting Successfully
12-12 22:42:05.778: DEBUG/JBtlSpp(122): After NativeJBtlSpp_Create, status=SUCCESS, Context = 15
12-12 22:42:05.778: DEBUG/JBtlRbtlServices(122): addUser: Entered, userRefCount = 1
12-12 22:42:05.778: DEBUG/BluetoothSppService(122): port create returned status SUCCESS
12-12 22:42:05.778: DEBUG/JBtlSpp(122): enable: Entered
12-12 22:42:05.778: DEBUG/JBtlSpp(122): enable: UUID=00001101-0000-1000-8000-00805f9b34fb
12-12 22:42:05.778: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Enable: Entered
12-12 22:42:05.978: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Enable: BTL_SPP_Enable returned 0
12-12 22:42:05.978: DEBUG/JBtlSppNative(122): NativeJBtlSpp_Enable:Exiting
12-12 22:42:05.978: DEBUG/JBtlSpp(122): After NativeJBtlSpp_Enable, status=SUCCESS
12-12 22:42:05.978: DEBUG/JBtlSpp(122): enable: Exiting
12-12 22:42:05.978: DEBUG/BluetoothSppService(122): port enable returned status SUCCESS
12-12 22:42:57.678: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_OPEN_IND: Entered
12-12 22:42:57.678: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_OPEN_IND: Exiting
12-12 22:42:57.678: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_OPEN: Entered
12-12 22:42:57.678: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_OPEN: status: 0 context:15
12-12 22:42:57.708: DEBUG/JBtlSpp(122): nativeCb_open: Entered from 00:10:60:56:83:28
12-12 22:42:57.718: DEBUG/JBtlSpp(122): nativeCb_open: Calling callback
12-12 22:42:57.718: DEBUG/BluetoothSppService(122): connected called!
12-12 22:42:57.718: DEBUG/BluetoothSocket(889): SppPort connected()
12-12 22:42:57.718: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_OPEN: Exiting
12-12 22:42:57.718: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_MODEM_STATUS_IND: Entered
12-12 22:42:57.718: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_MODEM_STATUS_IND: Exiting

Часть B: Это второе соединение, и оно позволяет блокировать серверный сокет без подтверждения.

Похоже, вроде этого он не запускал BluetoothSppService , как часть A. Но BluetoothSppService является нижним уровнем в структуре andorid, поэтому я не знаю, как с ним обращаться.

12-12 22:43:29.158: DEBUG/(122): signal_BTEVENT_LINK_CONNECT_IND: Entered
12-12 22:43:29.168: DEBUG/(122): signal_BTEVENT_LINK_CONNECT_IND: context: 1, errCode: 0
12-12 22:43:29.168: DEBUG/(122): signal_BTEVENT_LINK_CONNECT_IND: Calling Java Link Connect Indication callback
12-12 22:43:29.178: DEBUG/JBtlBmg(122): nativeLinkConnectInd
12-12 22:43:29.218: DEBUG/BluetoothService(122): Callback - linkConnectInd, btErrCode = NO_ERROR, bdAddr = C0:E4:22:18:ED:C1
12-12 22:43:29.258: DEBUG/JBtlBmg(122): getKnownDeviceInfo: Entered
12-12 22:43:29.258: DEBUG/JBtlBmg(122): getKnownDeviceInfo: Calling NativeJBtlBmg_GetKnownDeviceInfo
12-12 22:43:29.258: DEBUG/(122): NativeJBtlBmg_GetKnownDeviceInfo: Entered
12-12 22:43:29.258: DEBUG/(122): NativeJBtlBmg_GetKnownDeviceInfo: Calling BTL_BMG_GetKnownDeviceInfo
12-12 22:43:29.268: DEBUG/JBtlBmgJniKnownDeviceInfo(122): setValues: Entered
12-12 22:43:29.268: DEBUG/(122): NativeJBtlBmg_GetKnownDeviceInfo:Exiting
12-12 22:43:29.268: DEBUG/JBtlBmg(122): getKnownDeviceInfo: After NativeJBtlBmg_GetKnownDeviceInfo, status=SUCCESS
12-12 22:43:29.278: DEBUG/JBtlBmg(122): getKnownDeviceInfo: Exiting
12-12 22:43:29.278: DEBUG/BluetoothService(122): onRemoteDeviceConnected, device C0:E4:22:18:ED:C1 is Paired
12-12 22:43:29.278: DEBUG/BluetoothService(122): Sending ACTION_ACL_CONNECTED intent, address = C0:E4:22:18:ED:C1
12-12 22:43:29.278: DEBUG/BluetoothA2dpService(122): Received intent with action: android.bluetooth.device.action.ACL_CONNECTED
12-12 22:43:29.298: DEBUG/(122): signal_BTEVENT_LINK_CONNECT_IND: Exiting
12-12 22:43:29.988: DEBUG/(122): signal_BTEVENT_LINK_DISCONNECT: Entered
12-12 22:43:29.988: DEBUG/(122): signal_BTEVENT_LINK_DISCONNECT: context: 1, errCode: 19
12-12 22:43:29.988: DEBUG/(122): signal_BTEVENT_LINK_DISCONNECT: Calling Java Link Disconnect callback
12-12 22:43:29.988: DEBUG/JBtlBmg(122): nativeLinkDisconnect
12-12 22:43:29.998: DEBUG/BluetoothService(122): Callback - linkDisconnect, btErrCode = USER_TERMINATED, bdAddr = C0:E4:22:18:ED:C1, status = NO_ERROR
12-12 22:43:30.018: DEBUG/BluetoothService(122): Sending ACTION_ACL_DISCONNECTED intent, address = C0:E4:22:18:ED:C1

Часть C: Если я отключил предыдущее существующее соединение, оно будет работать следующим образом. А затем запустите часть A. Итак, я могу снова установить связь.

Создание прокси-объекта BluetoothSpp и выполнение BluetoothSppService .

12-12 22:45:45.758: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_MODEM_STATUS_IND: Entered
12-12 22:45:45.758: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_MODEM_STATUS_IND: Exiting
12-12 22:45:45.788: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_CLOSE_IND: Entered
12-12 22:45:45.788: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_CLOSE_IND: Exiting
12-12 22:45:45.798: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_CLOSED: Entered
12-12 22:45:45.798: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_CLOSED: status: 0 context:15
12-12 22:45:45.798: DEBUG/JBtlSpp(122): nativeCb_closed: Entered
12-12 22:45:45.798: DEBUG/BluetoothSppService(122): close called!
12-12 22:45:45.798: DEBUG/JBtlSppNative(122): signal_SPP_EVENT_CLOSED: Exiting
12-12 22:45:46.158: DEBUG/JBtlSppNative(122): NativeJBtlSpp_ReadNative:Exiting with 1

Кажется, logcat должна понравиться часть A, соединение может быть установлено. Я сомневался, что причина, по которой сокет сервера был заблокирован без подтверждения, заключается в том, что эти операции обрабатываются нижним уровнем платформы Android. Но я не знаю, как получить или как выполнить эту услугу, например BluetoothSppService , JBtlSppNative , JBtlBmg и т. Д.

У вас есть есть опыт работы с этим?
Я сомневался, что причина, по которой сокет сервера был заблокирован без подтверждения, заключается в том, что эти операции обрабатываются нижним уровнем платформы Android. Но я не знаю, как получить или как выполнить эту услугу, например BluetoothSppService , JBtlSppNative , JBtlBmg и т. Д.

У вас есть есть опыт работы с этим?
Я сомневался, что причина, по которой сокет сервера был заблокирован без подтверждения, заключается в том, что эти операции обрабатываются нижним уровнем платформы Android. Но я не знаю, как получить или как выполнить эту услугу, например BluetoothSppService , JBtlSppNative , JBtlBmg и т. Д.

У вас есть есть опыт работы с этим?
Если да, я буду признателен, если вы поделитесь со мной. Или дайте мне несколько советов или предложений о том, как разрешить устройству принимать другое соединение, если предыдущее соединение существовало.

6
задан Frambot 15 June 2013 в 01:47
поделиться