나는 블루투스를 통해 파일을 전송해야하는 Android 앱을 작성 중입니다. 지금 나는 단지 텍스트를 보내려하고있다. 전송 장치가 올바르게 전송 된 것으로 보이고 수신 장치가 다른 장치에서 연결을 수신하고 있습니다. 리시버는 리스닝 서버 소켓으로부터 소켓을 가져올 수 있고 그것으로부터 입력 스트림을 얻을 수 있습니다. 내 문제는 그것이 입력 스트림에서 읽을 수 없다는 것입니다. 내가 당황스럽게 생각하는 부분은 관련 소켓이 닫혀 있다는 것을 나타내는 Exception은 Socket.isConnected()가 읽으려고 시도하기 전과 예외가 발생한 후에 true를 반환한다는 것입니다. 어떻게 가능할까요? 어떻게이 코드 수 :이 로그 메시지isConnected가 true를 반환하면 Exeption이 연결되어 있지 않은 이유는 무엇입니까?
가class ReceiveThread(val socket: BluetoothSocket):Thread() {
var count:Int = 0
var bytes:Int = 0
val buffer:ByteArray = ByteArray(1024)
val byteList = mutableListOf<Byte>()
val inStream:InputStream
init {
inStream = socket.inputStream
}
override fun run() {
BluetoothService.log("Begin ${BTS_Constants.THREAD_RECEIVE}")
BluetoothService.log("preparing to read data (socket connected): ${socket.isConnected}")
name = BTS_Constants.THREAD_RECEIVE
try {
bytes = inStream.read(buffer)
}catch (e:Exception){
BluetoothService.log("error reading from stream (socket connected):${socket.isConnected}", e)
BluetoothService.state = BTS_Constants.STATE_NONE
}
if (byteList.size>0) BluetoothService.log("data read: ${byteList.get(0) as Char}") else BluetoothService.log("failed to get")
}
fun cancel() = inStream.close()
}
결과 :
11-28 23:23:33.958 25325-25534/com.example.zemcd.fileblue D/BluetoothService: Begin RECEIVE
11-28 23:23:33.958 25325-25534/com.example.zemcd.fileblue D/BluetoothService: preparing to read data (socket connected): true
11-28 23:23:34.035 25325-25534/com.example.zemcd.fileblue E/BluetoothService: error reading from stream (socket connected): true
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.InputStream.read(InputStream.java:101)
at com.example.zemcd.fileblue.ReceiveThread.run(BluetoothService.kt:263)
11-28 23:23:34.035 25325-25534/com.example.zemcd.fileblue D/BluetoothService: failed to get
는 소켓이 왜이 사실 반환 닫혀 있다면? 어떻게 소켓이 닫히는 지 추적 할 수 있습니까? 이 점을 이해하도록 도와주세요.
연결 상태를 추적 할 수있는 방법이 있습니까? 연결이 닫히는 것을 볼 수 있도록? isConnected와 비슷하지만 연결 상태가 좋을까요? 또는 연결이 닫히는 곳을 찾는 다른 방법은 없습니까? –
이미 발견했습니다. I/O를 수행하면 예외가 발생합니다. 'SocketTimeoutException' 이외의 IOException은 연결에 치명적입니다. – EJP
그래서 예외가 던져지면 연결이 바로 닫힙니 까? 그러나 연결이 닫혀 있기 때문에 예외가 발생하지 않습니까? –