(藍牙)網絡編程中,使用InputStream read方法讀取數據阻塞的解決方法


問題如題,這個問題困擾了我好幾天,今天終於解決了,感謝[1]

首先,我要做的是android手機和電腦進行藍牙通信,android發一句話,電腦端程序至少就要做到接受到那句話。android端發送信息的代碼如下:

try {
  Log.i(
"Test", "begin saying hello world");
String test
= "Hello world, I am james"; outputStream.write(test.getBytes()); Log.i("Test", "complete saying hello world");

}
catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  Log.e(
"Test", "fail to write 1 to server");
}

電腦服務器端接收程序如下:

byte[] bt = new byte[1024];
int bytes = inputStream.read(bt);
String test = new String(bt);
Syste.out.println(test);

最后的結果是服務器端阻塞在

int bytes = inputStream.read(bt);

沒有能夠得到進一步的執行。

最后在[1]中找到了解決方法。通過Inputstream中的availa()函數來獲得目前流中可以讀取到的字節數目,然后再讀取。這個方法的意思是返回此輸入流下一個方法調用可以不受阻塞地從此輸入流讀取(或跳過)的估計字節數。請看改后的電腦端接收信息的代碼:

int count = 0;
while(count == 0){
    count = inputStream.available();
}
if( count != 0 ){
    System.out.println(count);
    byte[] bt = new byte[count];
    int readCount = 0;
    while(readCount < count){
        readCount += inputStream.read(bt, readCount, count-readCount);
}
System.out.println(readCount);
String xx = new String(bt);
System.out.println(xx);    

這樣,就能實現完整的信息接收了。通過count來保存當前流中可以讀取的字節數,然后通過read(byte[],offset,len)函數來讀取流中的字節,由於網絡通信中,read函數不一定能一次將所有可讀的字節讀完整,所以用一個readCount來記錄已經讀到bt數組中的字節,當readCount和count相等后,說明讀取完整了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM