2017-11-29 9 views
-1

나는 블루투스를 통해 파일을 전송해야하는 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 

는 소켓이 왜이 사실 반환 닫혀 있다면? 어떻게 소켓이 닫히는 지 추적 할 수 있습니까? 이 점을 이해하도록 도와주세요.

답변

1

isConnected()Socket의 상태를 알려줍니다. 연결하거나 수락 한 적이 있다면 사실을 반환합니다. 당신이 그것을 닫은 후에도. 피어가 연결을 끊으면 마술처럼 거짓이되지 않습니다.

연결의 상태는 예외입니다.

+0

연결 상태를 추적 할 수있는 방법이 있습니까? 연결이 닫히는 것을 볼 수 있도록? isConnected와 비슷하지만 연결 상태가 좋을까요? 또는 연결이 닫히는 곳을 찾는 다른 방법은 없습니까? –

+0

이미 발견했습니다. I/O를 수행하면 예외가 발생합니다. 'SocketTimeoutException' 이외의 IOException은 연결에 치명적입니다. – EJP

+0

그래서 예외가 던져지면 연결이 바로 닫힙니 까? 그러나 연결이 닫혀 있기 때문에 예외가 발생하지 않습니까? –