2011-09-23 33 views
2

我試圖從藍牙套接字讀取InputStream數據,並且該方法在開始時完成它想要做的事情。但由於某種原因,它後來並沒有讀取所有內容。InputStream.read方法調用得太快

下面是我現在使用的方法:

public int read(byte[] b, int off, int len) 

當我檢查字節數組的結束部分是數據的下一部分的開始。這意味着讀取方法在讀完之前再次被調用。有誰知道如何處理這個問題?

+0

你嘗試把它放在同步塊嗎? –

+3

@Babu - 我不認爲這是問題。我認爲這是一個經典的問題,假設流協議將以與發送的相同大小的塊傳送原始數據。 –

回答

5

你將不得不在你的應用協議設計中自己處理這個問題。

假設你正在使用的Android BluetoothSocket與RFCOMM,javadoc中這樣說:

RFCOMM是一個面向連接的,運輸通過藍牙。

藍牙套接字接口類似於TCP套接字:

雖然這不是水晶從這些報價明確,含義是,流的行爲就像TCP流一樣,這意味着read方法傳遞的字節中沒有可靠的信息/數據包/記錄邊界。如果發送方決定連續發送兩條消息,則接收方可能會在讀取緩衝區中獲得一條消息的結尾和下一條消息的開頭。

因此......如果你有一個在套接字上運行的面向消息/數據包的應用協議,你必須設計你的應用協議,以便接收者可以識別消息邊界,而不管有多少/多少字節通過一次。換句話說,您需要在協議中使用數據包字節計數,數據包結束標記或某些數據,以便接收方能夠確定每個數據包的結束位置和下一個數據包的起始位置。