2017-11-28 1 views
1

私はBluetoothソケットを介して書き込みと読み取りを試みていますが、私のreadBytes呼び出しは完了していません。私はこれがとてもシンプルだと思うかもしれませんが、おそらく私はちょうど間違ったタイプのストリームまたは何かを使用しています。現時点では、私のコードはちょうどバイトとして少量のテキストを送信しています。これは、ストリーム上のファイルを読み書きするコードで置き換えられるプレースホルダコードです。ここに私の受信スレッドである:Kotlin readBytes()が完了しない

class ReceiveThread(val inStream:BufferedInputStream):Thread() { 

var bytes:ByteArray? = null 


override fun run() { 
    BluetoothService.log("Begin ${BTS_Constants.THREAD_RECEIVE}") 
    BluetoothService.log("preparing to read data") 
    name = BTS_Constants.THREAD_RECEIVE 

//here is my new code 
    inStream.use { 
     do{ 
      count++ 
      BluetoothService.log("read loop round $count") 
      byteList.add(it.read() as Byte) 
     }while (it.available()>0) 
    } 
    BluetoothService.log("data read: ${byteList.get(0) as Char}") 
} 
} 

、ここでは私の送信スレッド:データが正常に送信され

class SendThread(val outStream:BufferedOutputStream, val file:File? = null):Thread(){ 

var bytes:ByteArray? = null 

override fun run() { 
    BluetoothService.log("Begin : ${BTS_Constants.THREAD_SEND}") 
    name = BTS_Constants.THREAD_SEND 

    bytes = "hello testing".toByteArray() 
    try{ 
     outStream.use { 
      it.write(bytes) 
      it.flush() 
     } 
    }catch (ioe:IOException){ 

    } 

    BluetoothService.log("data sent") 
} 

} 

、およびBluetoothService.log("data sent")呼び出しが到達し、実行しているデバイスのためのlogcatに表示されています送信スレッド。受信スレッドを実行しているデバイスでは、「データの読み込み準備」メッセージがログに記録されますが、data read: "$bytes message"はログに記録されません。

どうすればこのinStream.readBytes()呼び出しを完了できますか?

編集:私は受け付けており、新たなエラーメッセージ:

11-27 23:45:29.298 16253-16413/com.example.zemcd.fileblue E/AndroidRuntime: FATAL EXCEPTION: RECEIVE 
                     Process: com.example.zemcd.fileblue, PID: 16253 
                     java.io.IOException: bt socket closed, read return: -1 
        at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:588) 
        at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96) 
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) 
        at java.io.BufferedInputStream.read(BufferedInputStream.java:254) 
        at com.example.zemcd.fileblue.ReceiveThread.run(BluetoothService.kt:230) 

答えて

2

あなたはKotlin拡張機能readBytesのソースに見れば、あなたはそれがInputStream.read(buffer) > 0ながらループを開始していることがわかります。 documentationの場合:

このメソッドは、入力データが使用可能になるか、ファイルの終わりが検出されるか、例外がスローされるまでブロックします。

このループを2回繰り返すと、プログラムがフリーズします。 メソッドreadBytesを使用しないでください。ちょうどread(buffer)。例えば - https://developer.android.com/guide/topics/connectivity/bluetooth.html#ManagingAConnection

アップデート:今すぐ

ReceiveThreadストリームから一つのメッセージを受け取ることができます。しかし、あなたのBluetoothソケットは近くにあります。だからあなたの問題は、セットアップのBluetooth接続とinStreamの初期化です。多分あなたは間違った部分を送るかもしれません。

+0

ありがとうございました。この回答は非常に情報ですが、私はコードに変更を加えましたが、まだブロックしています。おそらく私は誤解しています。 'bytes = it.readBytes()'を 'byteSize = it.read(buffer)'に変更し、自分のコードにbyteSize変数を追加しました。私の受信スレッドのIntフィールドとして。もっと何かをする必要がありますか?私はもうドキュメントを見ていないし、kotlinを使っているので、 'while(byteSize = it.read(buffer))!= - 1)'ループを実行できません。 –

+0

@Mox_z SendThread呼び出しメソッドが書き込まれる前にReceiveThread呼び出しメソッドが読み取られていますか? –

+0

はい、書き込み側が送信を完了しています。これはBufferedInputStreamであることとは何か関係がありますか?そこには別のテクニックが使われていますか? –

関連する問題