2012-09-10 115 views
5

我需要以編程方式將數據寫入1到100 MB(以1024字節爲單位)到遠程藍牙設備。兩者都是Android設備。這裏是我的客戶端程序的示例代碼段來傳輸數據 - 雖然在Android 2.2(升級Froyo)運行這段代碼Android BluetoothSocket OutputStream無限地寫入塊

bTSocket.connect(); //connect to remote BT device 
DataOutputStream outStream = new DataOutputStream(bTSocket.getOutputStream()); 
byte[] buffer = new byte[1024]; 
int bytesToTransfer = 1000000; 
while (bytesToTransfer > 0) { 
    outStream.write(buffer); 
    outStream.flush(); 
    bytesToTransfer -= 1024; 
} 
outStream.close(); 

,它工作正常。但是在Android 2.3.4和4.0.4的情況下,outStream.write(buffer)在傳輸一些數據(例如100 KB)後無限制地阻塞。值得一提的是,遠程設備未配置爲偵聽數據。可以寫入的數據量是否有限制?

+0

你是說對方沒有從套接字讀取數據? –

+0

準確地說,服務器未配置爲通過流讀取數據。 –

回答

5

藍牙套接字在讀取和寫入操作時處於阻止模式。

如果填滿發送緩衝區,那麼.write()可以阻止您嘗試發送更多數據的唯一功能是阻止。阻止它的替代方法是返回「操作會阻止!」錯誤代碼,就像TCP套接字在非阻塞模式下可以執行的一樣。但藍牙套接字不提供任何這種非阻塞模式。

您聲明遠程藍牙設備未從其插槽讀取數據。在這種情況下,本地發送緩衝區和遠程接收緩衝區,每個只有一定的有限大小,最終會填滿。此時,您的.write()操作將被阻止,直到遠程端從其套接字讀取某些東西。你不能只保留兆字節的數據,並希望它只是將它緩衝在任何地方。

不同Android平臺之間的差異可能與相關藍牙堆棧中可用的不同緩衝區空間有關。

+0

感謝Trevor的回覆。 –

+0

@Trevor感謝您的信息。即使當我試圖編寫數千千字節時,我也從未遇到過很長時間的阻塞問題。我仍然想知道什麼是緩衝區大小(使用Android 2.3.3)。 –

相關問題