2016-06-28 9 views
0

私が取り組んでいるプログラムでは、私は2つのデバイスがBluetooth経由でお互いに話しています。アプリケーションが最初に起動されると、両方のデバイスが正常に接続されますが、接続が切断されて再初期化されると(つまり、サーバースレッドが強制終了されてから再作成されると)、BluetoothServerSocketが接続を受け付けても失敗します。サーバー側では、私はBluetooth ServerSocketが受け付けていません

void handleConnection() throws Exception { 
    bss = BluetoothAdapter.getDefaultAdapter().listenUsingRfcommWithServiceRecord(Constants.BITMAP_NAME, 
         UUID.fromString(Constants.BITMAP_UUID)); 
    running.set(true); 
    Logger.logE("accepting"); 
    BluetoothSocket socket = bss.accept(); 
    Logger.logE("accepted"); 
    context.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if (connectionCallback != null) 
       connectionCallback.onConnectionMade(); 
     } 
    }); 
    //handle connection in a loop... 
    try { 
     is.close(); 
     is = null; 
    } catch (IOException ignored) { 
     Logger.exception(ignored); 
    } 
    try { 
     socket.close(); 
     socket = null; 
    } catch (IOException ignored) { 
     Logger.exception(ignored); 
    } 
} 

を持っており、クライアント側で私は、サーバーを再起動し、メッセージ

java.io.IOException: read failed, socket might closed or timeout, read ret: -1 

と外に、クライアントの回を再接続しようとした後

void handleConnection() throws Exception { 
    BluetoothSocket socket = connect. 
      createRfcommSocketToServiceRecord(UUID.fromString(Constants.BITMAP_UUID)); 
    Logger.logE("preparing to connect"); 
    socket.connect(); 
    Logger.logE("Connected"); 
    if (connectionCallback != null) { 
     context.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       connectionCallback.onConnectionMade(); 
      } 
     }); 
     Logger.logE("callback fired"); 
    } 
    //Handle the connection... 
    Logger.logE("closing client"); 
    try { 
     os.close(); 
     os = null; 
    } catch (Exception ex) { 
     Logger.exception(ex); 
    } 
    try { 
     socket.close(); 
     socket = null; 
    } catch (Exception ex) { 
     Logger.exception(ex); 
    } 
} 

を持っていますsocket.connect();行にあります。クライアントを監視するときにLogcatにメッセージpreparing to connectが表示され、サーバーを監視するときにメッセージacceptingが表示されますが、その時点以降は進んでいません。

+0

「接続が切断されて再初期化されたとき」、エラー(java.io.IOException:読み込みに失敗しました。ソケットが閉じられたかタイムアウト、読み込みret:-1)が発生しましたか? – solosodium

+0

@solosodiumが更新されました。 – sjyn

答えて

1

クライアント側のコードは問題ありません。私は問題はサーバーからだと思う。

あなたは、BluetoothのためのAndroid documentationに行けば、あなたは、Bluetoothサーバ用の例が表示されます。

private class AcceptThread extends Thread { 
    private final BluetoothServerSocket mmServerSocket; 

    public AcceptThread() { 
     // Use a temporary object that is later assigned to mmServerSocket, 
     // because mmServerSocket is final 
     BluetoothServerSocket tmp = null; 
     try { 
      // MY_UUID is the app's UUID string, also used by the client code 
      tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); 
     } catch (IOException e) { } 
     mmServerSocket = tmp; 
    } 

    public void run() { 
     BluetoothSocket socket = null; 
     // Keep listening until exception occurs or a socket is returned 
     while (true) { 
      try { 
       socket = mmServerSocket.accept(); 
      } catch (IOException e) { 
       break; 
      } 
      // If a connection was accepted 
      if (socket != null) { 
       // Do work to manage the connection (in a separate thread) 
       manageConnectedSocket(socket); 
       mmServerSocket.close(); 
       break; 
      } 
     } 
    } 

    /** Will cancel the listening socket, and cause the thread to finish */ 
    public void cancel() { 
     try { 
      mmServerSocket.close(); 
     } catch (IOException e) { } 
    } 
} 

ポイントは、すべての着信接続を追跡するためのスレッドでサーバーを実行する必要があること。あなたは通信のために着信ソケットのハンドルが必要です。

コミュニケーションが終わったら、ソケットを閉じることを覚えておくことも非常に重要です。ソケットが正しく閉じられていないと、現在の問題の原因となっている可能性のあるソフトウェアレイヤーが認識されずにハードウェアが接続されてしまうことがあります(実際の通信のコードが不足しているため不確定です)。詳細については、this投稿を参照してください。

+0

あなたは100%正しいです。私はソケットが正しく閉鎖されていないと信じていました。 – sjyn

関連する問題