2012-03-14 1 views
2

여기 상황이 있습니다. Bluetooth를 사용하여 연결된 클라이언트를 서로의 상태로 업데이트하는 Android를 만들고 있습니다. 아이디어는 블루투스 연결 호스트가 이러한 모든 통계를 보유한 다차원 배열을 유지하는 것입니다. 클라이언트가 새로운 상태의 호스트를 업데이트 할 때마다 호스트는 배열의 데이터를 업데이트 한 다음이 데이터를 모든 클라이언트에 보냅니다.Android 블루투스 여러 클라이언트가 하나의 호스트에

물론 이것은 우유와 쿠키처럼 들리지만 유감 스럽지만 그렇지 않습니다. 각 끝에 Bluetooth 소켓이 있어야하며 그 중 하나는 호스트 소켓이되어야 함을 이해합니다. 그래서, 하나의 연결을 완료하면 꽤 똑바로 보인다. 하지만 더 많은 연결을 허용하려면 어떻게해야합니까? 나는 주변에서 읽고 있었고 분명히 각 연결마다 새로운 스레드를 만들어야 만했다. 그게 어떻게 작동하는지 모르겠어 누군가 설명해 줄 수 있니?

답변

2

각 연결에 대한 스레드를 필요로하는 이유는 이것이다 :

하면 두 개의 연 소켓, sock1 및 sock2을 상상해보십시오. 해당 소켓에서 읽으려면, 당신은, 당신이있는 당신이 바이트는 저장 위치를 ​​바이트 배열은 "버퍼"

in1.read(buffer); 

전화 sock1에서 읽기, 이제

InputStream in1 = sock1.getInputStream(); 
InputStream in2 = sock2.getInputStream(); 

같은 것을 호출 할 수 있습니다 독서.

그러나 read()는 차단 호출입니다. 즉, 반환하지 않으며 read() 할 몇 바이트가있을 때까지 다음 줄을 실행하지 않습니다. 따라서 sock1을 읽으려고하면 sock2를 읽을 수 없으며 같은 스레드에 있으면 sock2를 읽을 수 없습니다.

따라서 연결 당 스레드가 하나 인 경우 각 스레드는 read()를 호출하고 입력을 기다릴 수 있습니다. 다른 스레드 중 하나가 실행 중일 때 입력이 발생하면 스레드의 차례가 올 때까지 기다린 다음 계속 진행합니다.

실제로 이것을 구현하려면 스레드를 확장하는 클래스에 하나의 연결을 처리하는 코드를 사용해야합니다.

많은 세부 사항이 관련되어 있습니다 - 나는 좋은 자습서로 Android BluetoothChat sample을 제안 할 것입니다.

+0

답장을 보내 주셔서 감사합니다. 이전에 BluetoothChat 샘플을 살펴 봤지만 코드를 따라갈 수있을 정도로 코드에 익숙하지 않은 것 같습니다. 그러나 설명서를 살펴 보니 직선적 인 것처럼 보였습니다.하지만 나에게 단서가되는 부분이 있습니다. 연결을 받아들이고 블루투스 소켓을 처리 할 수있는 방법으로 전달하려면 스레드에서 serversockets을 열어 두어야합니까? – Zizo47

+1

예, 블루투스 활용에 사용 된 전략입니다. – mfrankli

+0

그래, 고맙습니다. 그동안 많은 답변을 주셨습니다. 귀하의 의견을 말해 줄 수 있습니다. 그것은 당신이 stackoverflow에 사람들에게 메시지를 보낼 수 없다는 부끄러운 일입니다, 그렇지 않으면 나는 아마 발생할 다른 질문에 대답하도록 요청했을 것입니다. <어쨌든, 다시 한번 감사드립니다 ... – Zizo47