私は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)
ありがとうございました。この回答は非常に情報ですが、私はコードに変更を加えましたが、まだブロックしています。おそらく私は誤解しています。 'bytes = it.readBytes()'を 'byteSize = it.read(buffer)'に変更し、自分のコードにbyteSize変数を追加しました。私の受信スレッドのIntフィールドとして。もっと何かをする必要がありますか?私はもうドキュメントを見ていないし、kotlinを使っているので、 'while(byteSize = it.read(buffer))!= - 1)'ループを実行できません。 –
@Mox_z SendThread呼び出しメソッドが書き込まれる前にReceiveThread呼び出しメソッドが読み取られていますか? –
はい、書き込み側が送信を完了しています。これはBufferedInputStreamであることとは何か関係がありますか?そこには別のテクニックが使われていますか? –