2012-03-14 38 views
2

這是情況。我正在創建一個利用藍牙來更新彼此狀態的連接客戶端的Android。這個想法是讓藍牙連接的主機擁有一個包含所有這些統計數據的多維數組。每次客戶端更新主機的新狀態時,主機會更新陣列中的數據,然後將其發送給所有客戶端。Android藍牙多個客戶端到一個主機

當然,這聽起來像牛奶和餅乾給我,但不幸的是,它不是。我知道我需要在每端都有一個藍牙套接字,並且其中一個需要成爲主機套接字。所以,完成一個連接似乎非常簡單。但是如果我想接受更多的連接呢?我一直在閱讀,顯然我必須爲每個連接創建一個新的線程。我不明白這是怎麼回事,有人能解釋一下嗎?

回答

2

你需要爲每個連接分配一個線程的原因是這樣的:

想象一下,你有兩個打開的套接字,sock1和sock2。爲了從這些插槽讀取,您可以調用像

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

現在,從sock1閱讀,你叫

in1.read(buffer); 

其中「緩衝」是一個字節數組,您在其中存儲字節您讀。

但是,read()是一個阻塞調用 - 換句話說,它不會返回,並且您不會執行下一行,直到有一些字節需要讀取()。所以如果你嘗試閱讀sock1,你將永遠讀不到sock2,反之亦然,如果它們在同一個線程中。

因此,如果每個連接有一個線程,每個線程都可以調用read(),並等待輸入。如果其他線程正在執行時發生輸入,則等待該線程輪到來,然後繼續。

要實際執行此操作,只需將代碼粘貼到擴展Thread的類中即可。

有很多細節 - 我建議Android BluetoothChat sample作爲一個很好的教程。

+0

感謝您的回覆。我以前看過BluetoothChat示例,但我想我不熟悉代碼足以遵循它。但是,我瀏覽了文檔,看起來很直接,但有一部分讓我無能爲力。我應該在服務器上打開一個線程以保持接受連接,然後將它傳遞給可以處理藍牙套接字的方法? – Zizo47 2012-03-14 17:01:13

+1

是的,這是我在使用藍牙技術時使用的策略 – mfrankli 2012-03-14 17:05:12

+0

好的,非常感謝您的回答,我可以告訴您,您在說什麼。這是一個恥辱,你不能在stackoverflow上給人發信息,否則我會要求你回答其他可能會出現的問題。<無論如何,再次感謝... – Zizo47 2012-03-14 17:09:53

相關問題